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

lxml库提取HTML标签文本异常:子标签后文本无法获取的解决方法

解决lxml提取子标签后文本内容的问题

你遇到的核心问题是:当<p>标签内部存在子标签<i>时,元素的.text属性仅能返回该元素第一个子节点之前的文本内容(这里就是<i>标签前的空白),而目标文本WANTED TEXT属于子标签<i>的后续内容,所以直接调用.text会返回空。下面是几种可行的解决方法:

方法1:用XPath的string()函数提取全部文本

直接通过XPath的string()函数获取<p>标签下的所有文本内容,再清理多余空白:

from lxml import etree
from io import StringIO
html_parser = etree.HTMLParser()
# 使用string()直接获取p标签下的所有文本
tmp_xp = "string(//p[1])"
text_content = etree.parse(StringIO("""<div> <p class="test1"> <i class="empty"> </i> WANTED TEXT </p> </div>"""), html_parser).xpath(tmp_xp)
# 清理首尾空白和多余换行
clean_text = text_content.strip()
print(clean_text)  # 输出: WANTED TEXT

方法2:获取子标签的tail属性

目标文本是<i>标签的后续内容,可以直接提取该子标签的tail属性:

from lxml import etree
from io import StringIO
html_parser = etree.HTMLParser()
tmp_xp = "//p[1]/i"
selected_i = etree.parse(StringIO("""<div> <p class="test1"> <i class="empty"> </i> WANTED TEXT </p> </div>"""), html_parser).xpath(tmp_xp)
clean_text = selected_i[0].tail.strip()
print(clean_text)  # 输出: WANTED TEXT

方法3:用itertext()遍历所有文本节点

如果<p>标签内有多个子元素,itertext()会遍历所有文本内容,拼接后再清理:

from lxml import etree
from io import StringIO
html_parser = etree.HTMLParser()
tmp_xp = "//p[1]"
selected_tag = etree.parse(StringIO("""<div> <p class="test1"> <i class="empty"> </i> WANTED TEXT </p> </div>"""), html_parser).xpath(tmp_xp)
# 遍历所有文本片段并拼接,再清理格式
clean_text = ''.join(selected_tag[0].itertext()).strip()
print(clean_text)  # 输出: WANTED TEXT

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:01:12