使用BeautifulSoup解决lxml 解析出现错误“Opening and ending tag mismatch”(标签不匹配)
我在使用爬虫的时候发现有些html使用lxml库去解析,他会出现“Opening and ending tag mismatch”(标签不匹配)问题,改用BeautifulSoup库后又可以解析成功。
·
前言
我在使用爬虫的时候发现有些html使用lxml库去解析,他会出现“Opening and ending tag mismatch”(标签不匹配)问题,改用BeautifulSoup库后又可以解析成功。
tsw.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>小李</h1>
</body>
</html>
test.py
from lxml import etree
try:
xml = etree.parse('tsw.html')
print("解析成功!")
except etree.XMLSyntaxError as e:
print("解析错误:", e)
报错原因
这时它会解析错误,在以上的html中出现了<meta>标签没有闭合出现了解析错误。因为parse要求比较严格,只要html/xml中出现没有闭合的标签就会出现解析失败。
直接使用文件打开输出
转为字符串直接输出
with open('tsw.html', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
使用BeautifulSoup解决
先用 BeautifulSoup 解析修复,再转换为 lxml:
from bs4 import BeautifulSoup
from lxml import etree
# 读取文件内容
with open('tsw.html', 'r', encoding='utf-8') as file:
content = file.read()
# 先用 BeautifulSoup 解析
soup = BeautifulSoup(content, 'lxml')
# 将解析结果转换为字符串,以移除不合法的字符或修正格式
cleaned_content = str(soup)
# 再用 lxml 解析
try:
lxml_content = etree.fromstring(cleaned_content)
print("清理后解析成功!")
except etree.XMLSyntaxError as e:
print("解析错误:", e)
# 输出解析结果
print(etree.tostring(lxml_content, pretty_print=True, encoding='unicode'))
BeautifulSoup 会修复 HTML 中潜在的格式问题,而 lxml 则会严格地解析经过修复的内容。这样可以在一定程度上避免编码问题带来的解析错误。
报错根本
为什么会出现报错呢,因为
-
BeautifulSoup:
- 对于常见的错误(如标签未闭合、属性不完整等)会自动进行修复,因此解析不规范的文档时更具容错性。
-
lxml:
- 对于语法错误较为敏感,可能会因为一些小错误而报错。需要确保文档格式符合标准。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)