Python XPath遇特殊字符截断:如何完整提取含HTML实体的标题?
解决HTML标题完整提取的问题
看起来你的问题出在HTML实体解析和文本提取的方式上,我来一步步帮你搞定:
问题根源分析
- 第一个案例里,
<title>Tom & Jerry » The First Adventure</title>中的&没有转义成合法的&,属于不规范HTML。解析器遇到未转义的&时,会尝试把后面的内容识别为实体(但&Jerry不是合法实体),导致解析出错,最终只能提取到Tom。 - 第二个案例中,虽然
&转成了合规的&,但直接用//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实体(比如把»转成») ) # 用这个解析器加载你的HTML内容 tree = etree.HTML(your_html_content, parser=parser)
2. 用XPath的string()函数提取完整文本
别再用 text() 了,改用XPath的 string() 函数,它会提取目标元素下的所有文本内容(包括解析后的实体):
title = tree.xpath('string(//title)').strip()
这个方法不管是解析器修复后的未转义&,还是实体»,都能正确解析并提取到完整标题: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 » The First Adventure</title>(经解析器修复后)<title>Tom & Jerry » The First Adventure</title>
用上面的方法都能正确提取到完整的 Tom & Jerry » The First Adventure。
内容的提问来源于stack exchange,提问作者pythoncrawling101
相关产品推荐
相关产品推荐

