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

Python XPath遇特殊字符截断:如何完整提取含HTML实体的标题?

解决HTML标题完整提取的问题

看起来你的问题出在HTML实体解析和文本提取的方式上,我来一步步帮你搞定:

问题根源分析

  • 第一个案例里,<title>Tom & Jerry &raquo; The First Adventure</title> 中的 & 没有转义成合法的 &amp;,属于不规范HTML。解析器遇到未转义的 & 时,会尝试把后面的内容识别为实体(但 &Jerry 不是合法实体),导致解析出错,最终只能提取到 Tom 。
  • 第二个案例中,虽然 & 转成了合规的 &amp;,但直接用 //title/text() 可能只提取了第一个文本节点,或者解析器对 » 的处理逻辑导致内容截断,所以只拿到 Tom & Jerry。

解决方案

1. 先确保HTML被正确解析(处理实体和不规范代码)

如果你用的是 lxml,创建解析器时要开启实体解析和错误恢复功能,这样能更好地兼容不规范的HTML:

from lxml import etree

# 创建带实体解析和错误修复的HTML解析器
parser = etree.HTMLParser(
    encoding='UTF-8',
    recover=True,  # 自动修复不规范的HTML代码
    resolve_entities=True  # 解析HTML实体(比如把&raquo;转成»)
)

# 用这个解析器加载你的HTML内容
tree = etree.HTML(your_html_content, parser=parser)

2. 用XPath的string()函数提取完整文本

别再用 text() 了,改用XPath的 string() 函数,它会提取目标元素下的所有文本内容(包括解析后的实体):

title = tree.xpath('string(//title)').strip()

这个方法不管是解析器修复后的未转义&,还是实体&raquo;,都能正确解析并提取到完整标题:Tom & Jerry » The First Adventure。

备选方案:用BeautifulSoup更省心

如果你觉得XPath有点绕,用BeautifulSoup可以更直观地搞定,它会自动处理实体和不规范HTML:

from bs4 import BeautifulSoup

soup = BeautifulSoup(your_html_content, 'lxml')  # 也可以用内置的'html.parser'
title = soup.title.string.strip()

直接就能拿到完整的标题文本,不用纠结实体解析的细节。

效果验证

不管是哪种HTML格式:

  • <title>Tom & Jerry &raquo; The First Adventure</title>(经解析器修复后)
  • <title>Tom &amp; Jerry » The First Adventure</title>

用上面的方法都能正确提取到完整的 Tom & Jerry » The First Adventure。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:41