You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

lxml解析不识别索引:XPath定位意大利税码失败求助

问题描述

尝试使用Python抓取并解析HTML,提取意大利税码“VTLLCU86S03I348V”。通过浏览器检查复制的完整XPath无法定位目标元素,但普通XPath(如//div/p/a)可正常工作;当XPath包含div[3]/div这类索引时就失效,且发现浏览器生成的XPath以单/开头,认为应该用双//。以下是最小复现代码示例:

from lxml import etree
import requests

# GET 
page = requests.get('https://notariato.it/it/notary/luca-vitale/')

# PARSING
parser = etree.HTMLParser()
tree = etree.parse(StringIO(page.text), parser)

nome_raw = tree.xpath('//html/body/div[3]/section[2]/div/div[1]/div/section/div/div/div/div[6]/div/h4')

for i in range(len(nome_raw)):
    print(nome_raw[i].text)
解决要点
  • 补全缺失导入:代码中使用StringIO但未导入,需添加from io import StringIO,否则会触发NameError导致解析流程中断。
  • 索引XPath失效的核心原因:
    • 浏览器渲染的DOM与requests获取的原始HTML存在差异:页面可能包含JS动态生成的节点,或浏览器自动补全了HTML结构(如缺失的<head>、<body>标签),导致节点索引与原始HTML不匹配。
    • 依赖索引的XPath稳定性极差,页面布局微调(新增/删除节点)就会失效,建议改用基于属性、文本特征的定位方式。
  • 目标税码的稳定定位示例:
    税码所在节点有明确的上下文特征,可采用以下更可靠的XPath:
    # 直接匹配包含目标税码的文本节点
    tax_code = tree.xpath('//p[contains(text(), "VTLLCU86S03I348V")]/text()')
    # 或通过父元素类名定位
    tax_code = tree.xpath('//div[@class="col-md-6"]/p[2]/text()')
    
  • 验证HTML结构差异:将page.text保存到本地文件,对比浏览器DOM与原始HTML的结构差异,确认节点索引是否准确。示例代码:
    with open('page.html', 'w', encoding='utf-8') as f:
        f.write(page.text)
    

内容的提问来源于stack exchange,提问作者SabDeM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:40:04