xpath只能定位到前几个元素,后面的都返回空列表
我看了后面的网页文件,格式都一样,只是单纯的定位不到
之前更严重,我用了绝对路径,返回的直接是空列表
下面是源代码:
import requests
from lxml import etree
url = "https://www.zbj.com/search/service/?kw=saas&r=2"
header = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.81"
}
resp = requests.get(url, headers=header)
html = etree.HTML(resp.text)
divs = html.xpath('//*[@id="__layout"]/div/div[3]/div/div[4]/div/div[2]/div[1]/div')
for div in divs:
prise = div.xpath("./div/div[3]/div[1]/span/text()")
print(prise)
XPath 定位元素时,确保你的 XPath 表达式是准确的,并且与页面结构匹配。有时候,网页的结构可能会经常更改,因此 XPath 表达式也需要随之更新。
在你提供的代码中,使用了绝对路径来定位元素。绝对路径在页面结构发生较大变化时可能会不稳定。建议尝试使用相对路径,以更灵活地定位元素。
同时,还可以使用以下方法来诊断问题并改进您的 XPath 表达式:
使用浏览器开发者工具:打开目标网页,使用浏览器的开发者工具来检查元素的 XPath。这可以帮助您确保 XPath 表达式是正确的。
检查网页源代码:查看网页源代码,确保您正在寻找的元素确实存在,并且没有在页面中使用 iframe 或其他框架。
使用更简单的 XPath 表达式:尝试使用更简单的 XPath 表达式来定位元素。例如,您可以首先尝试定位更具体的父元素,然后再进一步定位子元素,以确保准确性。
考虑等待加载:有些网页使用 JavaScript 动态加载内容,可能需要等待一段时间才能获取完整的页面内容。您可以使用等待机制来确保页面完全加载后再执行 XPath 查询。
多次请求:有时,网站可能会通过多次请求获取数据,您可能需要模拟多次请求来获取所有的数据。
请尝试根据上述建议对你的代码进行修改,以更好地定位目标元素。如果问题仍然存在,请提供更多关于要定位的具体元素和网页结构的信息。
定位不到是因为页面后面有些数据是由js加载的,requests库无法等待js加载,可以使用selenium库完成
from lxml import etree
from selenium import webdriver
# 创建一个浏览器实例
driver = webdriver.Chrome()
url = "https://www.zbj.com/search/service/?kw=saas&r=2"
# 打开页面
driver.get(url)
# 获取页面内容
page_content = driver.page_source
# 关闭浏览器
driver.quit()
html = etree.HTML(page_content)
divs = html.xpath('//*[@id="__layout"]/div/div[3]/div/div[4]/div/div[2]/div[1]/div')
for div in divs:
prise = div.xpath("./div/div[3]/div[1]/span/text()")
print(prise)
以上以selenium模拟操作chrome浏览器,需要对应版本的chrome浏览器和chromedriver,安装python的第三方库selenium 具体可以自行搜索
【相关推荐】
from lxml import etree
text = '''
<div class="navli navli-first" name="second"><span class="nav_tit"><a href="javascript:;">时政</a><i class="group"></i></span></div>
'''
html = etree.HTML(text)
print(html.xpath('//div[contains(@class,"navli") and @name="second"]//a/text()'))
输出为['时政'] |