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

如何用BeautifulSoup解析含转义标签的HTML并提取Score值

问题

我有多个HTML文档,里面的标签都以&lt;和&gt;(对应<和>)的形式转义了,现在需要提取其中的Score值(比如示例里的&lt;Score&gt;613&lt;/Score&gt;)。

我把DataFrame转成元组遍历每个文档,用BeautifulSoup创建对象后调用.find_all('score'),但每次都返回空结果,试过考虑用正则,现在想找其他解决方案。

示例HTML片段

&lt;score_result&gt;
            &lt;Models&gt;
                &lt;Model&gt;
                    &lt;Id&gt;CLASS&lt;/Id&gt;
                    &lt;Description&gt;Classifier Model 2.0&lt;/Description&gt;
                    &lt;Score&gt;613&lt;/Score&gt;
                    &lt;Messages&gt;
                        &lt;Message&gt;
                            &lt;MessageType&gt;RC&lt;/MessageType&gt;
                            &lt;Code&gt;017111&lt;/Code&gt;
                            &lt;Description&gt;# of bananas, S&amp;amp;Accounts Established&lt;/Description&gt;
                        &lt;/Message&gt;
                        &lt;Message&gt;
                            &lt;MessageType&gt;RC&lt;/MessageType&gt;
                            &lt;Code&gt;P11P&lt;/Code&gt;
                            &lt;Description&gt;Absence of Banana&lt;/Description&gt;
                        &lt;/Message&gt;
                        &lt;Message&gt;
                            &lt;MessageType&gt;RC&lt;/MessageType&gt;
                            &lt;Code&gt;0111&lt;/Code&gt;
                            &lt;Description&gt;Presence of a Banana&lt;/Description&gt;
                        &lt;/Message&gt;
                        &lt;Message&gt;
                            &lt;MessageType&gt;RC&lt;/MessageType&gt;
                            &lt;Code&gt;0111&lt;/Code&gt;
                            &lt;Description&gt;# of Inquiries&lt;/Description&gt;
                        &lt;/Message&gt;
                    &lt;/Messages&gt;
                &lt;/Model&gt;
            &lt;/Models&gt;
        &lt;/score_result&gt;

当前代码

result = [(x,y) for x,y in zip(df['ID'], df['data'])]

Score_lst = []

for row in result:
    try: 
        Bs_data = BS(row[1])
        Score_lst.append(Bs_data.find_all('score'))
    

    except:
        print('Na')

预期输出

Score_lst 

[613,
...,
...,
....]

(...代表其他待解析的Score值)


解决方案

问题核心是你直接解析了转义后的文本,BeautifulSoup会把&lt;Score&gt;当成普通文本而非标签。以下是两种可靠的解决方法:

方法一:反转义后用BeautifulSoup解析

先把转义的HTML实体还原成原始标签,再用BeautifulSoup正常解析:

import html
from bs4 import BeautifulSoup as BS

result = [(x,y) for x,y in zip(df['ID'], df['data'])]
Score_lst = []

for row in result:
    try:
        # 第一步:反转义HTML实体,把& lt;转成<,& gt;转成>
        unescaped_data = html.unescape(row[1])
        # 第二步:解析还原后的内容
        Bs_data = BS(unescaped_data, 'lxml')  # 也可替换为'html.parser'
        # 提取Score标签的文本并转为整数
        score_tag = Bs_data.find('score')
        if score_tag:
            score = int(score_tag.get_text(strip=True))
            Score_lst.append(score)
        else:
            Score_lst.append(None)  # 无Score时添加None标记
    except Exception as e:
        print(f"处理失败: {e}")
        Score_lst.append(None)

方法二:正则表达式直接匹配

如果文档结构固定,也可以用正则直接匹配转义后的Score内容,这种方法无需反转义:

import re

Score_lst = []
# 匹配& lt;Score&gt;和& lt;/Score&gt;之间的数字
pattern = re.compile(r'&lt;Score&gt;(\d+)&lt;/Score&gt;')

for row in result:
    try:
        match = pattern.search(row[1])
        if match:
            Score_lst.append(int(match.group(1)))
        else:
            Score_lst.append(None)
    except Exception as e:
        print(f"处理失败: {e}")
        Score_lst.append(None)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:55:14