前言

我在使用爬虫的时候发现有些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:

    • 对于语法错误较为敏感,可能会因为一些小错误而报错。需要确保文档格式符合标准。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐