【问题标题】:XPath - Select all <p> elements does not workXPath - 选择所有 <p> 元素不起作用
【发布时间】:2013-09-20 15:45:24
【问题描述】:

我有一些基本的 selenium 代码和一个性能良好的 xpath 表达式。

xpath:

/html/body/div/div/table[2]/tbody/tr/td/div/table/tbody/tr//td/div[5]/table/tbody/tr[2]

选择我感兴趣的部分,包含很多

元素。

但是,像这样附加'//p':

/html/body/div/div/table[2]/tbody/tr/td/div/table/tbody/tr//td/div[5]/table/tbody/tr[2]//p

不只选择那些

元素。相反,我最终得到的是一个元素。

我显然缺少一些基本的东西。这是我的代码的示例:

#!/usr/bin/env python

from selenium import webdriver
from time import sleep


fp = webdriver.FirefoxProfile()

wd = webdriver.Firefox(firefox_profile=fp)

wd.get("http://someurl.html")


# appending //p here is the problem that finds only a single <a> element
elems = wd.find_element_by_xpath("/html/body/div/div/table[2]/tbody/tr/td/div/table/tbody/tr/td/div[5]/table/tbody/tr[2]//p")

print elems.get_attribute("innerHTML").encode("utf-8", 'ignore')

wd.close()

编辑:按照建议使用 find_element*s*_by_xpath 而不是 find_element 来解决(感谢 Alexander Petrovich 发现此问题)。

【问题讨论】:

  • 你在使用什么网址?
  • 如果网址不相关,我不想透露。我可能错了,但如果我错了,我想知道为什么。对不起,如果这听起来很粗鲁:) 我的代码可以吗?

标签: python xpath selenium


【解决方案1】:
  1. 不要使用这样的定位器。把它们缩短一点。类似//table[@attr='value']/tbody/tr[2]//p
  2. 要选择多个元素,请使用find_elements_by_xpath() 方法(它返回WebElement 对象列表)
  3. 您将无法使用elems.get_attribute()。相反,您必须遍历列表

    elems = wd.find_elements_by_xpath("/your/xpath")
    for el in elems:
        print '\n' + el.get_attribute('innerHTML').encode("utf-8", 'ignore')
    

【讨论】:

  • 谢谢!这些定位器是通过 firefox 自动生成的 :)
  • @ReutSharabani 我已经添加了如何缩短 xpath 的提示。阅读更多here。 w3schools 不是最好的教程,但您可以在那里获得一些有用的信息
  • MSDN 有一个不错的 xpath 示例部分:msdn.microsoft.com/en-us/library/ms256086.aspx
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多