网页抓取时单引号、双引号、破折号显示为�乱码问题求助
网页抓取字符乱码排查与解决
核心原因
出现�是编码解码不匹配导致的:网页用UTF-8等编码存储特殊字符,但抓取时用了错误的编码解码,或者终端/输出环境不支持目标编码。
排查思路与解决步骤
1. 确认网页实际编码
先明确网页的真实编码:
- 手动验证:打开目标网页,右键查看源代码,搜索
<meta charset="xxx">,通常会看到UTF-8; - 代码自动识别:
import requests url = "https://everydaypower.com/famous-movie-quotes/" response = requests.get(url) # 查看网页声明的编码 print("网页声明编码:", response.encoding) # 查看requests自动识别的实际编码 print("实际识别编码:", response.apparent_encoding)
如果两个编码值不一致,说明requests默认解码用错了编码。
2. 强制用正确编码解码
不要直接使用response.text,改用response.content.decode(正确编码):
# 用自动识别的编码解码 content = response.content.decode(response.apparent_encoding) # 或者明确指定UTF-8(如果网页确认是UTF-8编码) content = response.content.decode("utf-8")
这一步能确保特殊字符被正确解码。
3. 排除终端编码问题
如果解码后写入文件正常,但终端显示乱码,是终端编码不兼容:
- Windows CMD默认用GBK,可执行
chcp 65001切换为UTF-8编码后再运行脚本; - 或者直接将内容写入UTF-8编码的文件验证:
with open("quotes.txt", "w", encoding="utf-8") as f: f.write(content)
打开文件查看特殊字符是否正常,以此确认是终端还是抓取环节的问题。
4. 解析HTML时保持编码一致
如果用BeautifulSoup解析,确保传入的是正确解码后的内容:
from bs4 import BeautifulSoup soup = BeautifulSoup(content, "html.parser") # 提取引用内容示例 quotes = soup.select(".quote-text") for quote in quotes: print(quote.get_text(strip=True))
内容的提问来源于stack exchange,提问作者zelbow
相关产品推荐
相关产品推荐

