Python Selenium XPath返回Attr对象报错(应为元素)如何解决
报错原因
这个报错本质是不同工具的XPath接口规则差异导致的:
- Chrome爬虫扩展、lxml/Scrapy的原生XPath方法支持直接返回属性、文本节点结果,所以带
/@href的写法可以直接拿到链接值 - Selenium的元素定位方法(
find_element/find_elements)强制要求XPath返回值必须是DOM元素节点,直接写/@href会返回属性节点(也就是报错里提到的[object Attr]),不符合接口要求,因此触发报错。
修复方法
根据你使用的Python库选择对应方案即可:
- 基于Selenium的场景
不要在XPath里直接写属性提取逻辑,先定位到对应的<a>标签元素,再通过元素的属性方法取href值:from selenium.webdriver.common.by import By # 第一步:定位所有class为yuRUbf的div下的a标签元素 a_tags = driver.find_elements(By.XPATH, "//div[@class='yuRUbf']//a") # 第二步:遍历提取每个a标签的href属性 links = [tag.get_attribute("href") for tag in a_tags] - 基于lxml/Scrapy的场景
原XPath写法本身没有问题,触发报错是因为你调用了要求返回元素的封装方法,直接调用解析对象的原生xpath()方法即可正常提取:from lxml import etree # 构造解析对象 tree = etree.HTML(page_source) # 原XPath可直接运行,返回href属性值列表 links = tree.xpath("//div[@class= 'yuRUbf']//a/@href")
补充提示:
yuRUbf是Google搜索结果页的动态class名,会随页面版本迭代变更,如果后续出现定位失败的情况,优先校验class属性是否和当前页面结构匹配。
内容的提问来源于stack exchange,提问作者Markus Ham
相关产品推荐
相关产品推荐

