Python 为什么这个xpath在使用PhantomJS时不起作用?
我正在建立一个刮板,需要从十几个不同的网站刮价格 所有网站都使用JS来显示价格,所以我使用selenium来获取所需的数据 在开始构建scraper之前,我创建了一个XPath列表,用于获取外部文件中每个url的price元素 我使用FireFox和Firebug获得了这些xpath,无论我遇到什么错误,每次我都尝试使用selenium(PhantomJS驱动程序)获取这些元素: 似乎我的xpath是错误的,但我使用其他插件仔细检查了它,每次我在Firefox上测试xpath时它都是正确的 这里有两个不同的XPath,它们都应该工作(它们使用Firfox,但没有使用selenium): 下面是目标页面的html代码 下面是使用selenium获取元素的代码:Python 为什么这个xpath在使用PhantomJS时不起作用?,python,selenium,xpath,Python,Selenium,Xpath,我正在建立一个刮板,需要从十几个不同的网站刮价格 所有网站都使用JS来显示价格,所以我使用selenium来获取所需的数据 在开始构建scraper之前,我创建了一个XPath列表,用于获取外部文件中每个url的price元素 我使用FireFox和Firebug获得了这些xpath,无论我遇到什么错误,每次我都尝试使用selenium(PhantomJS驱动程序)获取这些元素: 似乎我的xpath是错误的,但我使用其他插件仔细检查了它,每次我在Firefox上测试xpath时它都是正确的 这里
"id('regular-hero')/div[3]/div[1]/div[2]/div/div[1]/div/div/span"
"/html/body/div[2]/div[3]/div[1]/div[2]/div/div[2]/div/div/span/text()[1]"
self.browser = wd.PhantomJS()
for n in xrange(len(self.url_list)):
url = self.url_list[n]
provider = self.provider_list[n]
self.browser.get(url)
for plan in provider:
for hosting_plan in provider[plan]:
xpath = hosting_plan.values()[0] # Get the xpath of a plan
price_elem = self.browser.find_element_by_xpath("//*")
print price_elem
self.browser.close()
所有循环都用于遍历包含xpath列表的JSON外部文件
怎么了?我应该试试什么?lxml能帮我吗(考虑到HTML代码有时会被破坏) 根据提供的链接,您可以将所需元素与以下
XPath
匹配:
//span[@class="term-price"]
如果您的元素是使用JavaScript
生成的,则需要等待一段时间才能看到元素的外观:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, "//span[@class='term-price']")))
显示目标的
HTML
代码element@Andersson我添加了目标页面HTML代码的链接,您可以对有问题的对象进行交互式的Selenium消除,然后将代码导出到Python。它应该指出你做错了什么。谢谢,但是为什么其他XPath不起作用呢?他们应该是正确的,对吗?我有一个很大的XPath列表,重做它会花费太多时间。你的XPath
es是绝对的。这意味着它们是固定的,并且对DOM
中的更改非常敏感DOM
不是常量:它可能会被某些事件或JavaScript
执行所更改。您应该找到相对的XPath
,它将匹配所有案例,而不与DOM
进行强绑定,但是我的价格元素是通过JS生成的,这会影响XPath吗?
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, "//span[@class='term-price']")))