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

使用BeautifulSoup解析HTML表格出现标签识别错误如何解决

BeautifulSoup解析非标准HTML表格异常解决方案

问题根因

核心问题出自两个点:

  1. 目标网站的表格HTML本身不规范,存在未闭合的<td>标签,Python内置的html.parser容错能力差,遇到这类错误会直接打乱后续DOM树的构建,将后续标签识别为前一个单元格的文本内容
  2. 特殊字符的嵌套转义进一步干扰了html.parser的解析判断,导致<被转义为&lt;后没有被正确还原

解决方案

步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:18:04