如何用BeautifulSoup解析含转义标签的HTML并提取Score值
问题
我有多个HTML文档,里面的标签都以<和>(对应<和>)的形式转义了,现在需要提取其中的Score值(比如示例里的<Score>613</Score>)。
我把DataFrame转成元组遍历每个文档,用BeautifulSoup创建对象后调用.find_all('score'),但每次都返回空结果,试过考虑用正则,现在想找其他解决方案。
示例HTML片段
<score_result> <Models> <Model> <Id>CLASS</Id> <Description>Classifier Model 2.0</Description> <Score>613</Score> <Messages> <Message> <MessageType>RC</MessageType> <Code>017111</Code> <Description># of bananas, S&amp;Accounts Established</Description> </Message> <Message> <MessageType>RC</MessageType> <Code>P11P</Code> <Description>Absence of Banana</Description> </Message> <Message> <MessageType>RC</MessageType> <Code>0111</Code> <Description>Presence of a Banana</Description> </Message> <Message> <MessageType>RC</MessageType> <Code>0111</Code> <Description># of Inquiries</Description> </Message> </Messages> </Model> </Models> </score_result>
当前代码
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会把<Score>当成普通文本而非标签。以下是两种可靠的解决方法:
方法一:反转义后用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>和& lt;/Score>之间的数字 pattern = re.compile(r'<Score>(\d+)</Score>') 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
相关产品推荐
相关产品推荐

