使用BeautifulSoup解析HTML表格出现标签识别错误如何解决
BeautifulSoup解析非标准HTML表格异常解决方案
问题根因
核心问题出自两个点:
- 目标网站的表格HTML本身不规范,存在未闭合的
<td>标签,Python内置的html.parser容错能力差,遇到这类错误会直接打乱后续DOM树的构建,将后续标签识别为前一个单元格的文本内容 - 特殊字符的嵌套转义进一步干扰了
html.parser的解析判断,导致<被转义为<后没有被正确还原
解决方案
步骤1:更换高容错解析器
优先使用lxml作为BeautifulSoup的解析器,它对非标准HTML的修正能力远强于内置的html.parser,操作如下:
首先安装依赖:
pip install lxml
修改BeautifulSoup初始化代码:
import requests from bs4 import BeautifulSoup page = 1 city = 'vantaa'.capitalize() URL = 'https://asuntojen.hintatiedot.fi/haku/?cr=1&t=3&l=0&search=1&sf=0&so=a&renderType=renderTypeTable&print=1&z={}&c={}'.format(page, city) resp = requests.get(URL) # 更换为lxml解析器 soup = BeautifulSoup(resp.content, "lxml") tables = soup.find_all('tbody', attrs={'class':'odd'}) table = max(tables, key=len) rows = table.find_all('tr')
修改后直接解析即可,90%以上的这类不规范HTML解析问题都会被自动修复。
步骤2:残留转义问题处理(可选)
如果更换解析器后仍存在转义残留,先处理原始响应文本再构造soup即可,之前的re.sub报错是因为你直接传入了BeautifulSoup的Tag对象而非字符串,修正写法如下:
import html # 先处理原始响应文本,还原转义字符 raw_html = html.unescape(resp.text) # 再构造soup soup = BeautifulSoup(raw_html, "lxml")
过往报错原因说明
unicode.unescape报错:Python3中该方法已迁移至html模块,即html.unescape,且不能直接作用于BeautifulSoup的Tag对象,仅可处理字符串类型的HTML内容re.sub报错:传入参数为BeautifulSoup的Tag元素,不是要求的字符串/字节类型,需先提取原始文本再做替换操作
内容的提问来源于stack exchange,提问作者qoob
相关产品推荐
相关产品推荐

