使用requests爬取的网页,保存后可以搜到我要的元素,但是使用lxml.etree.HTML()解析后定位不到该元素,通过定位它父级元素发现,父级下面的子元素丢掉了一部分,再通过lxml.etree.tostring()将解析后的网页保存下来,也搜不到该元素,可以确定是lxml.etree.HTML()解析丢失内容,通过lxml.parse()解析本地保存的网页也无法找到该元素,仍然丢失内容,lxml.etree解析存在问题,请问怎么解决?
(请不要定位head里面的描述,必须定位红框中的位置,解决lxml.etree.HTML()解析丢失内容的问题)
import requests
from lxml import etree
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58',
'referer':'https://www.ad.siemens.com.cn',
}
def parse_detail():
url = 'https://www.ad.siemens.com.cn/service/answer/solve_286822_1077.html'
res = requests.get(url,headers=headers)
with open('detail.html','w',encoding='utf-8') as f:
f.write(res.text)
html = etree.HTML(res.content)
content = html.xpath('//*[@class="extra-wide-answer"]')[0]
title = ''.join(content.xpath('//div[@class="top-title"]/div[1]/h1/text()')).strip() # 问题标题
description = html.xpath('/html/body/div[4]/div[2]/div[3]/div[8]/p[4]/text()') # 问题描述
判断解析出现问题的根本原因是网页内容在爬取和解析过程中可能被修改或丢失。针对这种情况,可以尝试使用其他HTML解析库(如BeautifulSoup等)再次解析,或者使用正则表达式进行匹配。另外,可以记录下未解析到目标元素的网页源代码,检查是否存在类似于嵌套不当、HTML语法错误等问题。
https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
上面是BeautifulSoup我之前收藏的文档,挺好用的
而根据您提供的Python代码,代码中的问题大概率出现在以下行:
content = html.xpath('//*[@class="extra-wide-answer"]')[0]
description = html.xpath('/html/body/div[4]/div[2]/div[3]/div[8]/p[4]/text()')
其中content = html.xpath('//*[@class="extra-wide-answer"]')[0]使用了相对路径,可能匹配到了多个元素;而下一行description = html.xpath('/html/body/div[4]/div[2]/div[3]/div[8]/p[4]/text()')使用了绝对路径,定位具体位置可能有误。建议尝试以下方法进行解决:
content = html.xpath('//div[@class="extra-wide-answer"]/node()')
description = html.xpath('//p[@class="regular-text-info"]/text()')
尝试使用BeautifulSoup等其他HTML解析库,比较一下解析后的结果是否一致;
检查网页源代码,确认该元素确实存在并且没有被动态加载替换。
问题描述大概率是动态加载显示的,但可以通过meta元素绕过