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

如何在BeautifulSoup4中处理XML文本内的小于号(<)?

XML含未转义数学符号<导致解析异常的解决办法

你的问题核心是XML文本里的<10未按规范转义,触发了lxml-xml严格解析的语法错误,以下是具体解决思路:

为什么会出错

XML规范明确要求:文本内容中的<、&属于特殊字符,必须转义为&lt;、&amp;(>、"、'在部分场景也需要转义)。lxml-xml是严格遵循XML标准的解析器,遇到未转义的<会直接判定为非法标签起始,终止解析并截断文档。

可行解决办法

1. 手动预处理转义(推荐,可得到合法XML)

必须把文本内容里的<转成&lt;,同时避开真正的XML标签起始<。可以用正则匹配非标签场景的<,示例代码:

import re
from bs4 import BeautifulSoup

def fix_xml_special_chars(raw_data):
    # 匹配<后不是字母/下划线的情况(排除标签起始的<)
    fixed_data = re.sub(r'<(?![a-zA-Z_])', '&lt;', raw_data)
    # 可选:转义文本中的>,严格XML规范建议处理
    fixed_data = re.sub(r'(?<![a-zA-Z_/])>', '&gt;', fixed_data)
    return fixed_data

# 预处理后再解析
processed_xml = fix_xml_special_chars(你的XML数据变量)
soup = BeautifulSoup(processed_xml, 'lxml-xml')

处理后<10会变成&lt;10,解析器能正常识别为数学符号,生成合法XML文档,你可以正常用find()等方法访问节点。

2. 换用容错解析器(无需转义,但无法得到严格合法XML)

如果不需要生成严格合法的XML,只是想读取内容,可以改用HTML模式的解析器(比如lxml或html.parser),这类解析器对未转义字符的容错性更高:

soup = BeautifulSoup(你的XML数据变量, 'lxml')  # 注意这里是'lxml'不是'lxml-xml'

虽然能正常解析并使用find(),但输出的文档不符合XML规范,无法作为合法XML传输或存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:53:20