关于#python#的问题:xpath只能定位到前几个元素,后面的都返回空列表

xpath只能定位到前几个元素,后面的都返回空列表

img

我看了后面的网页文件,格式都一样,只是单纯的定位不到

之前更严重,我用了绝对路径,返回的直接是空列表

下面是源代码:

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 表达式:

  1. 使用浏览器开发者工具:打开目标网页,使用浏览器的开发者工具来检查元素的 XPath。这可以帮助您确保 XPath 表达式是正确的。

  2. 检查网页源代码:查看网页源代码,确保您正在寻找的元素确实存在,并且没有在页面中使用 iframe 或其他框架。

  3. 使用更简单的 XPath 表达式:尝试使用更简单的 XPath 表达式来定位元素。例如,您可以首先尝试定位更具体的父元素,然后再进一步定位子元素,以确保准确性。

  4. 考虑等待加载:有些网页使用 JavaScript 动态加载内容,可能需要等待一段时间才能获取完整的页面内容。您可以使用等待机制来确保页面完全加载后再执行 XPath 查询。

  5. 多次请求:有时,网站可能会通过多次请求获取数据,您可能需要模拟多次请求来获取所有的数据。

请尝试根据上述建议对你的代码进行修改,以更好地定位目标元素。如果问题仍然存在,请提供更多关于要定位的具体元素和网页结构的信息。

定位不到是因为页面后面有些数据是由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 具体可以自行搜索

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^