python+selenium使用xpath定位的问题及解决
作者:wuXu_0720
这篇文章主要介绍了python+selenium使用xpath定位的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
python用selenium调chrome爬取网页信息遇到报错
1.InvalidSelectorException: Message: invalid selector: The result of the xpath expression is [object Attr]. It should be an element
原因是selenium不支持从xpath中直接获取text文本信息。
name=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2/text()") website=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/a[3]/@href")
xpath表达式修改为:
name=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2/text()") website=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/a[3]/@href")
2.Message: no such element: Unable to locate element:
xpath表达式一直无法准确定位,原因是通过浏览器开发者工具copy的xpath表达式和实际selenium获取的网页资源不同,表达式错误无法定位。(经对比发现是selenium有一个需用户同意的cookie弹窗)
通过print(web.page_source)拿到selenium获取的网页资源,发现有一个div未加载出来。
其实应该是body下第2个div。
通过开发者工具重新获得准确的xpath表达式。
原xpath表达式:
title = web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2").text
改为正确的xpath表达式:
title = web.find_element(By.XPATH,"/html/body/div[2]/div/div[2]/h2").text
3.使用发现selenium效率过低,一个网页全部加载完毕要1分钟左右。
解决办法是设置最长加载时长,超过时长则停止加载,开始定位数据。
from selenium.common.exceptions import TimeoutException web = webdriver.Chrome() web.set_page_load_timeout(10)#设置页面加载时长 web.set_script_timeout(10)#设置JS加载时长 try: web.get(str(url)) except TimeoutException: #加载超时异常处理 web.execute_script('window.stop()')
python selenium xpath高级定位用法
目前很多网页前端代码是框架或 JS 生成的,就导致了混乱而难以定位。
为了快速而又复杂定位 Selenium 中有一个 Xpath 选择器,可以选择复杂的页面定位,也是爬虫在网页定位中的较优的选择。
1、通过绝对路径定位元素
driver.find_element_by_xpath("html/body/div/form/input")
2、通过相对路径定位元素
driver.find_element_by_xpath("//input")
3、使用索引定位元素
driver.find_element_by_xpath("//input[1]")
4、使用XPATH的属性值定位元素
driver.find_element_by_xpath("//input[@id='username']") driver.find_element_by_xpath("//input[@type='submit'][@name='sub1']") driver.find_element_by_xpath("//input[@type='submit' and @name='sub1']") driver.find_element_by_xpath("//input[@type='submit' or @name='sub1']")
5、使用XPATH的属性名称定位元素
# 查找所有input标签中含有type属性的元素 driver.find_element_by_xpath("//input[@type]") # 查找所有a标签中含有onclick属性的元素 driver.find_element_by_xpath("//a[@onclick]") .....
6、使用任意值来匹配属性及元素
# 匹配所有input元素中含有属性的值为readonly的元素 driver.find_element_by_xpath("//input[@*='readonly']"))
7、使用模糊的属性值匹配
starts-with()
:匹配一个属性开始位置的关键字,是模糊定位的一种。
# 匹配id以submit开头的元素,如:id='submit' driver.find_element_by_xpath("//input[start-with(@id,'submit')]")
ends-with()
:匹配一个属性结束位置的关键字,是模糊定位的一种。
# 匹配id以submit结尾的元素,如:id='submit' driver.find_element_by_xpath("//input[ends-with(@id,'submit')]") contains():匹配一个属性值中包含的字符串,也是模糊定位的一种。 # 匹配id中含有submit的元素,如:id='submit' driver.find_element_by_xpath("//input[contains(@id,'submit')]") # 匹配name属性中包含na关键字的页面元素 driver.find_element_by_xpath("//input[contains(@name,'na')]") text():根据文本信息匹配元素位置。 # 如:<a href="http://www.baidu.com" rel="external nofollow" >百度搜索</a> driver.find_element_by_xpath("//a[text()='百度搜索'] ") driver.find_element_by_xpath("//a[contains(text(),"百度搜索")]") last():函数位置定位。 # 表示div元素->form元素->input元素的最后一个子元素,得到id值为e2的E元素 driver.find_element_by_xpath("/div/form/input[last()]")
8、过虑某个元素
name()
:获取标签名称。
# 表示过虑掉在 div id='query_reulst_box' 的下的 style 标签和 meta 标签 driver.find_element_by_xpath("//div[@id='query_reulst_box']/*[not(name()='style' and name()='meta')]//text())
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。