python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python+selenium使用xpath定位

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、使用模糊的属性值匹配

# 匹配id以submit开头的元素,如:id='submit'
driver.find_element_by_xpath("//input[start-with(@id,'submit')]")
# 匹配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、过虑某个元素

# 表示过虑掉在 div id='query_reulst_box' 的下的 style 标签和 meta 标签
driver.find_element_by_xpath("//div[@id='query_reulst_box']/*[not(name()='style' and name()='meta')]//text())

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文