使用BeautifulSoup处理XML丢失大量代码,如何解决?
问题根源与解决方案
核心问题:解析器选型错误
你用的html.parser是Python内置的HTML解析器,专为标准HTML设计,但维基百科文章内容是MediaWiki自定义的类XML标记(非严格标准HTML/XML)。这个解析器会自动"修正"它判定为不规范的标记结构——比如自动闭合未闭合标签、丢弃不符合HTML规则的嵌套内容、直接删除识别不了的特殊标签,这就是大量代码丢失的直接原因。
其他潜在问题
- 正则
re.sub的局限:正则无法正确处理嵌套的<ref>标签(比如<ref><ref>...</ref></ref>),还会被转义字符(如<ref>)干扰,导致替换不彻底或误替换。 str(soup)的格式化问题:HTML解析器转字符串时会重新排版内容,比如删除多余空格、调整标签结构,进一步破坏原内容完整性。
修复方案
更换为XML解析器
安装lxml库(对XML支持更完善),使用'lxml-xml'作为解析器,避免HTML解析器的自动修正逻辑:from bs4 import BeautifulSoup # 用XML解析器加载内容,保留原始结构 soup = BeautifulSoup(proc_string, 'lxml-xml') # 替换所有ref标签 for ref_tag in soup.find_all('ref'): ref_tag.replace_with('[XXR]') output_string = str(soup)若不想额外安装库,也可尝试内置的
'xml'解析器,但兼容性不如lxml。保留原始标记细节
若要完全保留原内容格式,避免解析器的任何修改,可使用XML解析器的prettify()方法输出,或遍历节点时更谨慎地处理文本内容。
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

