使用BeautifulSoup进行网页爬取返回空结果的原因排查
问题排查与修复
你的代码返回空结果主要有两个核心问题:
1. 提前处理HTML文本破坏了解析结构
你在把HTML传给BeautifulSoup之前,先用strip_accents处理了整个页面的文本内容。这个函数会修改字符编码,甚至可能破坏HTML标签的完整性——很多特殊字符在标签属性或结构里是必要的,提前处理会导致BeautifulSoup无法正确解析出DOM结构,自然拿不到文本。
正确的做法是:先让BeautifulSoup解析原始HTML,拿到文本后再去处理字符 accents。
2. 禁用重定向可能导致获取不到实际内容页面
你设置了allow_redirects=False,但目标网站可能存在跳转(比如域名内路径跳转),这会让你拿到的是重定向响应而非实际内容页面,自然解析不出文本。
修正后的代码
import requests from bs4 import BeautifulSoup import unicodedata def strip_accents(text): try: text = unicode(text, 'utf-8') except NameError: # unicode is default in Python 3 pass text = unicodedata.normalize('NFD', text)\ .encode('ascii', 'ignore')\ .decode("utf-8") return str(text) current_url = "https://www.diabete.qc.ca/en/understand-diabetes/all-about-diabetes/complications/female-sexuality-and-diabetes/" try: # 允许重定向,去掉verify=False(如果有证书问题再考虑加) response = requests.get(current_url, headers={'User-Agent': 'Mozilla/5.0'}) response.raise_for_status() # 主动抛出HTTP错误,方便排查 except requests.exceptions.RequestException as e: print("Error:", e) else: # 直接用原始响应内容解析,不要提前处理 soup = BeautifulSoup(response.content, "html.parser") # 先获取文本,再处理accents raw_text = soup.get_text(" ", strip=True) cleaned_text = strip_accents(raw_text) print(cleaned_text)
额外说明
- 加上
response.raise_for_status()可以帮你快速发现HTTP层面的错误(比如403、404),避免默默拿到空内容。 - 尽量不要用
verify=False,如果网站证书有问题,可以考虑安装信任证书,或者临时使用但不要长期保留。
内容的提问来源于stack exchange,提问作者Pedro Velmovitsky
相关产品推荐
相关产品推荐

