Python | 爬取网站中文乱码问题

本文介绍了一种常见的Python爬虫中遇到的HTML页面中文乱码问题及其解决方案。问题源于Python终端与HTML页面编码不一致导致,通过正确识别并转换编码格式可以有效解决。

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

问题描述

response = utils.send_request('http://www.crha.cn/gzdt.html')
print(response.text)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>å·¥ä½å¨æâ中å½ç ç©¶åå»é¢å­¦ä¼</title>
<meta name="Keywords" content="å·¥ä½å¨æ,中å½ç ç©¶åå»é¢å­¦ä¼,ç ç©¶åå»é¢å­¦ä¼,ç ç©¶åå»é¢,ç ç©¶åå»é¢å»ºè®¾" />
<meta name="Description" content="中å½ç ç©¶åå»é¢å­¦ä¼æ¯å¸®å©ç ç©¶åå»é¢æå»ºâ临åºé®é¢âå®éªç ç©¶âä¸´åºæ²»çâå¾ªç¯æ°æºå¶ï¼å½¢æå»è¯ç»åãå»å·¥ç»åãåºç¡ä¸ä¸´åºç»åãç ç©¶ä¸è½¬åç¸éå¥çç§æåæ°æ¨¡å¼ï¼ä¿è¿ç ç©¶åå»é¢æä¸ºçé¾å±éçççè¯çåºå°ã髿°è¯ç©è®¾å¤çç ååºå°ãåè¿å»çææ¯çåæ°åºå°åå»å­¦ç§æä¿¡æ¯ç交æµåºå°ã" />
<meta http-equiv="x-ua-compatible" content="ie=emulateie7" />
<link href="/Css/Style.css" rel="stylesheet" type="text/css" />
</head>
...

原因分析

Python 终端的编码方式是 UTF-8 ,而 HTML 编码方式并不是 UTF-8 (可通过 response.encoding 查询页面编码格式),所以中文产生了乱码

解决方案

response = utils.send_request('http://www.crha.cn/gzdt.html')
print(response.encoding)  # 1.查询页面的编码方式,此处为 ISO-8859-1

print(response.text.encode('ISO-8859-1').decode('utf-8'))  # 2.解码再编码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>工作动态—中国研究型医院学会</title>
<meta name="Keywords" content="工作动态,中国研究型医院学会,研究型医院学会,研究型医院,研究型医院建设" />
<meta name="Description" content="中国研究型医院学会是帮助研究型医院构建“临床问题―实验研究―临床治疗”循环新机制,形成医药结合、医工结合、基础与临床结合、研究与转化相配套的科技创新模式,促进研究型医院成为疑难危重病症的诊疗基地、高新药物设备的研发基地、先进医疗技术的创新基地和医学科技信息的交流基地。" />
<meta http-equiv="x-ua-compatible" content="ie=emulateie7" />
<link href="/Css/Style.css" rel="stylesheet" type="text/css" />
</head>
...

encode与decode函数

同步更新:https://www.jianshu.com/u/3925a970afc3

转载于:https://my.oschina.net/u/3946357/blog/3077518

### Python 网页抓取时解决中文字符乱码的方法 在使用 `requests` 库获取网页内容并遇到中文字符乱码的情况下,可以通过调整编码设置来解决问题。通常情况下,HTTP 响应头中包含的内容类型和编码信息并不总是可靠的,因此建议通过分析实际响应内容来确定合适的编码。 对于从网络上获取的数据流,在将其作为字符串处理之前应当正确解码。如果目标网站采用的是 GBK 或者 GB2312 这样的编码方案,则需要特别注意这一点[^3]。下面是一个具体的例子: ```python import requests from bs4 import BeautifulSoup def fetch_page(url): try: response = requests.get(url, timeout=30) response.raise_for_status() # 使用 apparent_encoding 来推测正确的编码方式 response.encoding = response.apparent_encoding soup = BeautifulSoup(response.text, 'html.parser') return soup.prettify() except Exception as e: print(f"Error occurred: {e}") return None if __name__ == "__main__": url = "http://example.com" page_content = fetch_page(url) if page_content is not None: with open('output.html', 'w', encoding='utf-8') as file: file.write(page_content) ``` 这段代码展示了如何利用 `apparent_encoding` 属性自动检测网页的实际编码格式,并据此读取页面内容。此外还引入了 Beautiful Soup 对 HTML 文档进行了初步解析以便后续操作[^4]。 值得注意的是,某些特殊场景下可能还需要进一步的手动干预来进行更精确的字符集转换工作。比如当发现自动探测的结果仍然不准确时,可以根据具体情况尝试指定特定的编码方式进行强制转换[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值