关于Python3.7的BeautifulSoup解析html文件缺失内容的问题

本文介绍了解决在使用BeautifulSoup解析HTML时遇到的问题,即“<!–[ifxxx]>”这类注释导致解析不完整的情况。通过正则表达式去除这些注释,成功实现了对目标标签的正确解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

从网站爬取html,用BeautifulSoup解析标签内容,发现用尽办法都找不到想要的标签。

分析过程

(1)把urlopen请求到的html打印出来,body是完整的;
(2)把BeautifulSoup解析后的soup打印出来,body只有少量的div,很快结束了。但后面还有一堆未格式化的html内容,被排斥在body外;
(3)一定是BeautifulSoup解析过程出问题了,由于直接请求到的html没有格式化过,太难看,copy到html在线格式化网页去格式化后再看看;
(4)对比格式化后的html和BeautifulSoup解析后的soup的内容,发现问题:soup在处理“<!–[if xxx]>”这样的注释时,不知道抽什么风直接结束了,在注释前面补上了body>和html>,导致缓存的soup缺失了后面大量的内容。

解决方案

注释在爬取数据过程中是无所谓的,可以用正则匹配过滤(见代码),之后就能正常解析自己想要的标签了。

代码

# -*- coding: utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup
import re

import io
import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent':user_agent}
url = "https://www.amazon.com/dp/B07K97BQDF"

#导入urlopen函数
#读取网页内容,如果网页中又中文要用“utf-8”解码

req = urllib.request.Request(url, headers = headers)
html = urllib.request.urlopen(req).read()
html = html.decode('utf8').replace('\n', '').replace('\r', '')
#正则去掉注释,存在<!--[if xxx]>和<![endif]-->用BeautifulSoup无法解析,基于Jsoup的HMTL在线解码可以,但python似乎没有可用的
re_format = re.compile('<!--[^>]*-->')
html = re_format.sub('', html)
bs = BeautifulSoup(html.encode('utf8'),"html.parser")
#获取标题
product_title = bs.find('span',id="productTitle").get_text()
print(product_title.strip())

网页图片:

网页图片
git下执行结果:
git下执行结果

后记

在尝试多次执行过程中会发现html仍有可能缺失or为空,再按上面的分析步骤分析的时候,发现在urlopen得到的结果就缺失了,网上搜索建议加上header(但我已经加了),后面尝试更换user_agent,问题解决了。

参考

分析过程参考:https://www.crifan.com/beautifulsoup_parse_html_fail_for_contain_special_if_statement/
后记参考:https://blog.csdn.net/weixin_42066185/article/details/81675726

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值