Python 3.x Selenium为自定义属性返回随机值

Python 3.x Selenium为自定义属性返回随机值,python-3.x,selenium,selenium-webdriver,Python 3.x,Selenium,Selenium Webdriver,我正在尝试从以下网站导出图像URL 在个人公寓的页面上,您可以看到其图像 图像的xpath选择器是“//div[@id='pv']//ul/li/img”,或者css:“div#pv ul>li>img”。当前活动映像设置了其属性src,而所有其他映像都有一个自定义属性'x',该属性将正确的src保存到映像 因此,我的python代码看起来 from selenium.webdriver.phantomjs import webdriver driver = webdriver.WebDriv

我正在尝试从以下网站导出图像URL

在个人公寓的页面上,您可以看到其图像

图像的xpath选择器是
“//div[@id='pv']//ul/li/img”
,或者css:
“div#pv ul>li>img”
。当前活动映像设置了其属性
src
,而所有其他映像都有一个自定义属性
'x'
,该属性将正确的src保存到映像

因此,我的python代码看起来

from selenium.webdriver.phantomjs import webdriver
driver = webdriver.WebDriver('path/to/driver')

url = 'url/to/any/page/from/the/list'
driver.get(url)
images = driver.find_elements_by_xpath(".//div[@id='pv']//ul/li/img")
for img in images:
    print img.get_attribute('src') or img.get_attribute('x')
仅打印第一项的正确答案。对于其他人,我得到一些随机的4位数字。尽管chrome的开发工具显示元素具有正确的值

在chrome的控制台上我试过

var images = document.querySelectorAll("div#pv ul > li > img");
for(var i = 0; i < images.length; ++i)
{
    console.log(images[i].getAttribute('src') || images[i].getAttribute('x'));
}
var images=document.queryselectoral(“div#pv ul>li>img”);
对于(变量i=0;i
这已打印出正确的结果

尝试使用lxml进行解析,这也按预期工作

Selenium为Chrome和Phantomjs驱动程序的属性x提供随机值。有什么问题


OS:Ubuntu14.04首先,让我给你一个道德上的免责声明:显然有人不想让你刮掉他们的网页,因此你不应该这样做。他们似乎非常渴望让别人很难这样做,这可能有很好的理由。因此,如果您对他们的数据有合法的用途,请要求他们为您提供一个用户友好的API。我相信,如果你对数据的使用对他们来说没问题,他们会很乐意这样做的

记住这一点,纯粹出于技术上的好奇心,为了有益于这里的学习,让我们仔细研究一下神秘的<代码> x<代码>:

运行
element.get_属性('x')
时,得到的是该DOM对象的
x
属性的值。
x
与您在Chrome开发工具(以及页面的源代码)中看到的
x
属性无关。DOM属性
x
实际上是指对象在页面上的位置(请注意,还有一个
y
属性)

但是,您要检索的是
x
属性的值。据我所知,使用WebDriver最简单的方法是使用
executeScript
和JavaScript方法
getAttribute
。在Java中,看起来是这样的:

String x = (String) ((JavascriptExecutor)driver).executeScript("return arguments[0].getAttribute('x')", element);

请注意,建议同时提供一个API和一个应与浏览器内部行为一致的API。因此,希望一旦所有驱动程序都实现了该标准,并且所有客户端绑定都公开了这些方法,这应该会更加清晰。

首先,让我给你一个道德上的免责声明:显然有人不希望你刮去他们的网页,因此,你不应该这样做。他们似乎很想让别人很难这样做,这可能有很好的理由。因此,如果您对他们的数据有合法的用途,请要求他们为您提供一个用户友好的API。我相信,如果你对数据的使用对他们来说没问题,他们会很乐意这样做的

记住这一点,纯粹出于技术上的好奇心,为了有益于这里的学习,让我们仔细研究一下神秘的<代码> x<代码>:

运行
element.get_属性('x')
时,得到的是该DOM对象的
x
属性的值。
x
与您在Chrome开发工具(以及页面的源代码)中看到的
x
属性无关。DOM属性
x
实际上是指对象在页面上的位置(请注意,还有一个
y
属性)

但是,您要检索的是
x
属性的值。据我所知,使用WebDriver最简单的方法是使用
executeScript
和JavaScript方法
getAttribute
。在Java中,看起来是这样的:

String x = (String) ((JavascriptExecutor)driver).executeScript("return arguments[0].getAttribute('x')", element);

请注意,建议同时提供一个API和一个应与浏览器内部行为一致的API。因此,希望一旦所有驱动程序都实现了该标准,并且所有客户端绑定都公开了这些方法,这应该会更加清晰。

老实说,如果您想刮取图像URL,
selenium
对于这样的任务来说有点笨拙。我强烈建议将其用于抓取、解析和提取

就你而言:

import requests
from bs4 import BeautifulSoup as soup

response = requests.get('https://www.list.am/category/60')
html = soup(response.text, 'lxml')

imgs = html.select('td img')

for img in imgs:
    print img['src']
结果是:

//a5m4x4y3.ssl.hwcdn.net/r/600/16639600.jpg
//a5m4x4y3.ssl.hwcdn.net/r/284/15251284.jpg
//a5m4x4y3.ssl.hwcdn.net/r/928/12968928.jpg
//a5m4x4y3.ssl.hwcdn.net/r/144/12331144.jpg
//a5m4x4y3.ssl.hwcdn.net/r/273/16737273.jpg
//a5m4x4y3.ssl.hwcdn.net/r/496/14458496.jpg
//a5m4x4y3.ssl.hwcdn.net/r/764/15412764.jpg
//a5m4x4y3.ssl.hwcdn.net/r/504/15517504.jpg
//a5m4x4y3.ssl.hwcdn.net/r/267/11907267.jpg
//a5m4x4y3.ssl.hwcdn.net/r/066/11907066.jpg
//a5m4x4y3.ssl.hwcdn.net/r/154/16306154.jpg
//a5m4x4y3.ssl.hwcdn.net/r/892/11906892.jpg
//a5m4x4y3.ssl.hwcdn.net/r/103/11899103.jpg
//a5m4x4y3.ssl.hwcdn.net/r/186/12070186.jpg
//a5m4x4y3.ssl.hwcdn.net/r/920/12069920.jpg
//a5m4x4y3.ssl.hwcdn.net/r/246/16666246.jpg
//a5m4x4y3.ssl.hwcdn.net/r/831/12069831.jpg
//a5m4x4y3.ssl.hwcdn.net/r/470/12067470.jpg
//a5m4x4y3.ssl.hwcdn.net/r/718/12067718.jpg
//a5m4x4y3.ssl.hwcdn.net/r/398/12067398.jpg
//a5m4x4y3.ssl.hwcdn.net/r/240/12067240.jpg
//a5m4x4y3.ssl.hwcdn.net/r/130/12067130.jpg
//a5m4x4y3.ssl.hwcdn.net/r/924/12066924.jpg
//a5m4x4y3.ssl.hwcdn.net/r/341/16600341.jpg
//a5m4x4y3.ssl.hwcdn.net/r/449/8614449.jpg
//a5m4x4y3.ssl.hwcdn.net/r/853/16597853.jpg
//a5m4x4y3.ssl.hwcdn.net/r/335/16759335.jpg
//a5m4x4y3.ssl.hwcdn.net/r/824/13520824.jpg
//a5m4x4y3.ssl.hwcdn.net/r/292/16613292.jpg
//a5m4x4y3.ssl.hwcdn.net/r/951/13532951.jpg
//a5m4x4y3.ssl.hwcdn.net/r/584/17137584.jpg
//a5m4x4y3.ssl.hwcdn.net/r/051/17111051.jpg
//a5m4x4y3.ssl.hwcdn.net/r/482/17042482.jpg
//a5m4x4y3.ssl.hwcdn.net/r/542/17110542.jpg
//a5m4x4y3.ssl.hwcdn.net/r/145/16998145.jpg
//a5m4x4y3.ssl.hwcdn.net/r/083/17012083.jpg
//a5m4x4y3.ssl.hwcdn.net/r/723/17110723.jpg
//a5m4x4y3.ssl.hwcdn.net/r/369/17013369.jpg
//a5m4x4y3.ssl.hwcdn.net/r/460/17127460.jpg
//a5m4x4y3.ssl.hwcdn.net/r/872/16560872.jpg
//a5m4x4y3.ssl.hwcdn.net/r/142/11467142.jpg
//a5m4x4y3.ssl.hwcdn.net/r/831/17004831.jpg
//a5m4x4y3.ssl.hwcdn.net/r/446/16664446.jpg
//a5m4x4y3.ssl.hwcdn.net/r/738/14977738.jpg
//a5m4x4y3.ssl.hwcdn.net/r/031/16845031.jpg
//a5m4x4y3.ssl.hwcdn.net/r/610/17085610.jpg
//a5m4x4y3.ssl.hwcdn.net/r/502/17004502.jpg

老实说,如果您想刮取图像URL,
selenium
对于这样的任务来说有点笨拙。我强烈建议将其用于抓取、解析和提取

就你而言:

import requests
from bs4 import BeautifulSoup as soup

response = requests.get('https://www.list.am/category/60')
html = soup(response.text, 'lxml')

imgs = html.select('td img')

for img in imgs:
    print img['src']
结果是:

//a5m4x4y3.ssl.hwcdn.net/r/600/16639600.jpg
//a5m4x4y3.ssl.hwcdn.net/r/284/15251284.jpg
//a5m4x4y3.ssl.hwcdn.net/r/928/12968928.jpg
//a5m4x4y3.ssl.hwcdn.net/r/144/12331144.jpg
//a5m4x4y3.ssl.hwcdn.net/r/273/16737273.jpg
//a5m4x4y3.ssl.hwcdn.net/r/496/14458496.jpg
//a5m4x4y3.ssl.hwcdn.net/r/764/15412764.jpg
//a5m4x4y3.ssl.hwcdn.net/r/504/15517504.jpg
//a5m4x4y3.ssl.hwcdn.net/r/267/11907267.jpg
//a5m4x4y3.ssl.hwcdn.net/r/066/11907066.jpg
//a5m4x4y3.ssl.hwcdn.net/r/154/16306154.jpg
//a5m4x4y3.ssl.hwcdn.net/r/892/11906892.jpg
//a5m4x4y3.ssl.hwcdn.net/r/103/11899103.jpg
//a5m4x4y3.ssl.hwcdn.net/r/186/12070186.jpg
//a5m4x4y3.ssl.hwcdn.net/r/920/12069920.jpg
//a5m4x4y3.ssl.hwcdn.net/r/246/16666246.jpg
//a5m4x4y3.ssl.hwcdn.net/r/831/12069831.jpg
//a5m4x4y3.ssl.hwcdn.net/r/470/12067470.jpg
//a5m4x4y3.ssl.hwcdn.net/r/718/12067718.jpg
//a5m4x4y3.ssl.hwcdn.net/r/398/12067398.jpg
//a5m4x4y3.ssl.hwcdn.net/r/240/12067240.jpg
//a5m4x4y3.ssl.hwcdn.net/r/130/12067130.jpg
//a5m4x4y3.ssl.hwcdn.net/r/924/12066924.jpg
//a5m4x4y3.ssl.hwcdn.net/r/341/16600341.jpg
//a5m4x4y3.ssl.hwcdn.net/r/449/8614449.jpg
//a5m4x4y3.ssl.hwcdn.net/r/853/16597853.jpg
//a5m4x4y3.ssl.hwcdn.net/r/335/16759335.jpg
//a5m4x4y3.ssl.hwcdn.net/r/824/13520824.jpg
//a5m4x4y3.ssl.hwcdn.net/r/292/16613292.jpg
//a5m4x4y3.ssl.hwcdn.net/r/951/13532951.jpg
//a5m4x4y3.ssl.hwcdn.net/r/584/17137584.jpg
//a5m4x4y3.ssl.hwcdn.net/r/051/17111051.jpg
//a5m4x4y3.ssl.hwcdn.net/r/482/17042482.jpg
//a5m4x4y3.ssl.hwcdn.net/r/542/17110542.jpg
//a5m4x4y3.ssl.hwcdn.net/r/145/16998145.jpg
//a5m4x4y3.ssl.hwcdn.net/r/083/17012083.jpg
//a5m4x4y3.ssl.hwcdn.net/r/723/17110723.jpg
//a5m4x4y3.ssl.hwcdn.net/r/369/17013369.jpg
//a5m4x4y3.ssl.hwcdn.net/r/460/17127460.jpg
//a5m4x4y3.ssl.hwcdn.net/r/872/16560872.jpg
//a5m4x4y3.ssl.hwcdn.net/r/142/11467142.jpg
//a5m4x4y3.ssl.hwcdn.net/r/831/17004831.jpg
//a5m4x4y3.ssl.hwcdn.net/r/446/16664446.jpg
//a5m4x4y3.ssl.hwcdn.net/r/738/14977738.jpg
//a5m4x4y3.ssl.hwcdn.net/r/031/16845031.jpg
//a5m4x4y3.ssl.hwcdn.net/r/610/17085610.jpg
//a5m4x4y3.ssl.hwcdn.net/r/502/17004502.jpg