Python新手使用BeautifulSoup爬取HTML时获取到损坏链接的问题
解决HTML爬取中链接出现
&的问题 嘿,我来帮你搞定这个链接损坏的问题!
问题原因
你写的测试HTML字符串里包含了HTML实体(比如&、<),这些是HTML里用来表示特殊字符的转义序列。当你直接把这个转义后的字符串传给BeautifulSoup时,它会把&当作普通文本处理,而不是自动转换成&,所以提取出来的href就变成了损坏的格式。
解决方案
有两种简单的方法可以修复这个问题:
方法1:手动解码HTML实体
使用Python自带的html模块里的unescape()方法,先把转义后的HTML字符串解码成正常字符,再传给BeautifulSoup:
from bs4 import BeautifulSoup import html # 原始转义后的HTML html_str = 'text <a href="Transfert.php?Filename=myfile_x86&version=5&param=13" class="nav" style="color: #000000" title = "">Download</a> text' # 解码HTML实体 decoded_html = html.unescape(html_str) soup = BeautifulSoup(decoded_html, "html.parser") for link in soup.find_all('a'): print(link.get('href'))
运行这段代码后,你就能得到正确的链接:Transfert.php?Filename=myfile_x86&version=5¶m=13
方法2:实际爬取时用请求库自动处理
如果你是从真实网站爬取HTML(而不是手动写测试字符串),用requests这类请求库获取页面时,它会自动帮你解码HTML实体,直接用response.text传给BeautifulSoup就没问题:
import requests from bs4 import BeautifulSoup # 替换成你要爬取的真实URL target_url = "https://example.com/your-page" response = requests.get(target_url) soup = BeautifulSoup(response.text, "html.parser") for link in soup.find_all('a'): print(link.get('href'))
原理说明
html.unescape()会把所有HTML实体转换为对应的普通字符:
&→&<→<>→>
这样BeautifulSoup就能正确解析出原始的链接参数了。
内容的提问来源于stack exchange,提问作者ZeroTolerance
相关产品推荐
相关产品推荐

