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

XPath提取HTML段落异常:仅获取首个<p>元素问题求助

解决lxml提取所有段落文本的问题

看起来你遇到的核心问题是只提取到了段落的直接文本,没包含子标签内的内容,而且对lxml获取元素文本的方式不太熟悉。咱们一步步来解决:

为什么你的代码没拿到完整内容?

  1. p.text的局限性:p.text只会返回当前<p>标签下的第一个直接文本节点,不会递归提取子标签(比如<strong>、<span>)里的文本。比如你的第一个<p>里,p.text只能拿到BLAH BLAH,而嵌套标签里的people、blah这些内容都被漏掉了。
  2. XPath写法可以优化://*[starts-with(name(), "p")]虽然能匹配<p>标签,但直接用//p更准确高效,避免误匹配其他以p开头的标签(比如<picture>)。

正确的解决方案

使用lxml元素的text_content()方法,它会自动提取当前元素及其所有子元素的文本,同时处理HTML实体(比如&#39;转成'、&quot;转成"),完美解决嵌套标签的文本提取问题。

完整代码示例

from lxml import html

# 你的示例HTML内容
body = '''<p>BLAH BLAH<strong><nobr><strong>people</strong></nobr></strong>&#39;s work <strong>&quot;Blah <nobr><strong><span style="font-size:14pt"><strong>blah</strong></span></strong></nobr> and <nobr><strong><span style="font-size:14pt"><strong>Nothing</strong></span></strong></nobr> quote&quot;</strong>lalal</p> <p>More text<strong><nobr><strong>More text</strong></nobr></strong> blah blah</p>'''

# 解析HTML
converted = html.fromstring(body)
# 获取所有<p>标签
paras = converted.xpath('//p')

# 拼接所有段落文本
string_content = ''
for p in paras:
    # 提取当前段落的完整文本,去除首尾空白
    para_text = p.text_content().strip()
    if para_text:
        string_content += ' ' + para_text

# 输出结果
print(string_content.strip())

运行结果

BLAH BLAHpeople's work "Blah blah and Nothing quote"lalal More textMore text blah blah

另一种方式:用XPath的string()函数

你也可以直接在XPath里提取每个<p>的完整文本,代码更简洁:

from lxml import html

body = '''[你的HTML内容]'''
converted = html.fromstring(body)
# 直接获取所有<p>的完整文本
all_para_texts = converted.xpath('//p/string()')
# 拼接成最终内容
string_content = ' '.join([text.strip() for text in all_para_texts if text.strip()])

这个方法和text_content()效果一致,选你习惯的方式就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:32:10