Python硒-选择子元素

时间:2019-07-09 00:11:42

标签: python selenium

我使用硒来获取URL的元素。在此我需要链接,但需要一个特定的div标签。 我按类名选择div,然后按xpath选择链接。但是,它将返回所有链接,也返回不在div中的那些链接。我在做什么错了?

browser.get(url)

elems = []
try:
    obj_div = browser.find_element_by_class_name("jss504")
    try:
        elems = obj_div.find_elements_by_xpath("//a[@href]")
    except NoSuchElementException:
        pass
except NoSuchElementException:
    pass

print(len(elems))

结果是,我得到41。但是,如果对浏览器对象执行相同的操作,则我也将获得相同的金额。这41个链接不是obj_div对象的链接,而是整个浏览器的链接。

2 个答案:

答案 0 :(得分:0)

Xpath可以为bidirectional,这意味着它会向前和向后查找元素。

作为您的xPath,它不仅可以询问上下文,还可以在DOM中向前和向后浏览。

来自文档:

前进
此步骤选择出现在上下文节点(或上下文节点本身)之后的后代或节点。

后退
此步骤选择出现在上下文节点(或上下文节点本身)之前的祖先或节点。


您可以尝试用css_selector替换xpath:

    elems = obj_div.find_elements_by_css_selector("a[href]")

并非该代码永远不会引发NoSuchElementException异常。如果找不到您要查找的内容,它将返回一个空列表。

如果您的头等舱元素是唯一的,则还可以仅通过一个查询来简化代码:

obj_div = browser.find_elements_by_css_selector(".jss504 a[href]")

答案 1 :(得分:-1)

您正在寻找起始元素下方的元素。为此,您必须使用自轴.,例如.//a[@href]。这表示从当前元素开始并在下面搜索。因为您没有包含它,所以XPath会搜索整个页面,即使您的代码似乎表明它应该从obj_div元素开始并且仅搜索(它使您以这种方式起作用,直到您理解原因为止还是有点困惑)。后裔。

其他说明:

您不需要嵌套try,因为您正在使用.find_elements_*。它总是返回一个集合,因此您必须查看该集合是否为空才能知道是否找到了一个元素。

修改后的完整代码如下

browser.get(url)

elems = []
try:
    obj_div = browser.find_element_by_class_name("jss504")
    elems = obj_div.find_elements_by_xpath(".//a[@href]")
except NoSuchElementException:
    pass

print(len(elems))

说了这么多,我建议您按照Nic Laforge的建议使用CSS选择器。我只是想解释一下您问题的答案,并提供一些其他反馈,以防将来对您或其他人有用。