我使用硒来获取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
对象的链接,而是整个浏览器的链接。
答案 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选择器。我只是想解释一下您问题的答案,并提供一些其他反馈,以防将来对您或其他人有用。