如何从结构不规范的网页爬取数据并提取标签对应信息?
不规范HTML数据提取解决方案
问题描述
用户提供了一段带有MIME编码残留的不规范HTML内容,以及基于requests+BeautifulSoup的基础解析代码,期望提取出如下格式的目标数据:
Address : 406 Pine Run, Knightdale, NC 27545 Dispatch Region : 7 Market: Triangle
并提出三个技术问题:
- 能否从上述结构不规范的HTML内容中提取出指定格式的目标数据?
- 如何识别此类HTML的结构,以获取各标签对应的详情信息?
- 如何从这类结构不规范的网站中完成数据爬取?
解答
1. 完全可以提取目标数据
这段HTML的核心问题是Quoted-Printable编码残留(比如属性里的3D",是编码后的双引号),但内容的逻辑结构是清晰的:字段名和对应值的关联关系、标签层级都有规律可循,只要先清理编码垃圾,再用BeautifulSoup定位即可完成提取。
2. 识别此类HTML结构的方法
- 先清理编码残留:把所有
3D"替换成",修复属性格式(比如class='3D"MsoNormal"'修正为class="MsoNormal"),让BeautifulSoup能正确解析标签结构。 - 定位关键特征:字段名(Address、Dispatch Region、Market)都在
<b>标签内,对应的值都在带有background:whitesmoke样式的<td>标签里,两者呈现“字段名标签→后续数据表格”的前后关联结构。 - 梳理层级关系:每个字段的结构链为:
<p><b>字段名</b></p>→ 紧邻的<table>→ 内部<td style="background:whitesmoke">标签内的文本即为对应值。
3. 针对不规范HTML的爬取步骤
步骤1:预处理清理编码垃圾
先对获取到的HTML内容做编码修复,解决Quoted-Printable编码残留问题:
# 清理编码残留,修复属性格式 clean_html = html_content.replace('3D"', '"').replace("='", "='\"").replace('"', '"')
步骤2:用BeautifulSoup解析提取数据
利用字段名和数据标签的特征,精准匹配对应内容:
import requests from bs4 import BeautifulSoup html_content = """[用户提供的原始HTML内容]""" # 预处理清理编码残留 clean_html = html_content.replace('3D"', '"').replace("='", "='\"").replace('"', '"') soup = BeautifulSoup(clean_html, 'html.parser') # 提取所有字段名(<b>标签内的文本) field_names = [b.get_text(strip=True) for b in soup.find_all('b')] # 提取所有对应值(背景为whitesmoke的td内的文本) field_values = [td.get_text(strip=True) for td in soup.find_all('td', style=lambda s: s and 'background:whitesmoke' in s)] # 按要求格式输出结果 for name, value in zip(field_names, field_values): print(f"{name} : {value}")
步骤3:复杂场景的补充方案
- 若字段和值的关联不是严格前后对应,可通过父节点遍历定位:找到字段名所在的
<p>标签,遍历其后续兄弟节点,找到包含数据的表格。 - 若编码残留更严重,可直接使用Python内置的
quopri模块解码Quoted-Printable编码:
import quopri # 直接解码Quoted-Printable编码的HTML内容 decoded_html = quopri.decodestring(html_content).decode('utf-8')
内容的提问来源于stack exchange,提问作者Ajay Kk
相关产品推荐
相关产品推荐

