Python 为什么这个xpath在使用PhantomJS时不起作用?

Python 为什么这个xpath在使用PhantomJS时不起作用?,python,selenium,xpath,Python,Selenium,Xpath,我正在建立一个刮板,需要从十几个不同的网站刮价格 所有网站都使用JS来显示价格,所以我使用selenium来获取所需的数据 在开始构建scraper之前,我创建了一个XPath列表,用于获取外部文件中每个url的price元素 我使用FireFox和Firebug获得了这些xpath,无论我遇到什么错误,每次我都尝试使用selenium(PhantomJS驱动程序)获取这些元素: 似乎我的xpath是错误的,但我使用其他插件仔细检查了它,每次我在Firefox上测试xpath时它都是正确的 这里

我正在建立一个刮板,需要从十几个不同的网站刮价格

所有网站都使用JS来显示价格,所以我使用selenium来获取所需的数据

在开始构建scraper之前,我创建了一个XPath列表,用于获取外部文件中每个url的price元素

我使用FireFox和Firebug获得了这些xpath,无论我遇到什么错误,每次我都尝试使用selenium(PhantomJS驱动程序)获取这些元素:

似乎我的xpath是错误的,但我使用其他插件仔细检查了它,每次我在Firefox上测试xpath时它都是正确的

这里有两个不同的XPath,它们都应该工作(它们使用Firfox,但没有使用selenium):

下面是目标页面的html代码

下面是使用selenium获取元素的代码:

"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']")))