python爬⾍-彻底解决⽹页乱码
前⾔
相信⼤家在使⽤requests模描写景色的作文 块在抓取⽹页时,有时会遇到类似����������格式的编码,很是头疼。
如何地暖清洗价格 解决这种问题呢?下⾯来看⼀下requests解码⽅式
requests如何解码(encoding)
直接来看源码:
当调⽤⽅法时,其内部是如何实现转码过程的
从图⽚中可以看出调⽤流程
1.⾸先获取ng
2.如果没有则会调⽤nt_encodi莫扎特简介 ng
3.将respon的响应内容encoding返回
那么ng是如何实现的呢?通常的乱码现象是这个⽅法造成的吗?
我们继续往下追
通过⽅法的调⽤,最终发现在返回respon对象时,调⽤了get_encoding_from_headers()⽅法来赋值ng
流程:
从respon的header中获取content-type属性,解析chart提取的编码,若header中没有chart字段则默认为ISO-8859-1编码模式,这
就是有时候⽆法解析中⽂,乱码的原因。
get_encoding_from_headers()⽅法实现
继续往下⾛
如果没有ng会调⽤apparent_encoding()⽅法来重新获取编码
apparent_encoding()使⽤chardet模块从⽹页的内容中分析⽹页编码的⽅式
⼩结
属性说明
ng从http header中提取响应内容编码,没有则默认为ISO-8859-1编码
nt_encoding从内容中分析出的响应内容编码
requests这个⽅案完美吗?那肯定是不完美的,不然也不会存在转换失败的问题
即便是使⽤c个人自我总结 hardet模块来识别整体的字符编码,同样也会存在识别错误的问题
这是⼀个存在编码问题的⽹页
import requests
if __name__ == '__main__':
url_ = '/42/'
respon = (url_)
print(ng) # ISO-8859-1
print(nt_encoding) # ISO-8859-1
print() # .text乱码
两种⽅式都调⽤了还是乱码~! 如何解决呢?有没有更好的⽅案?
解决思路
1.从相应头中获取编码
这个很好理解,获取相应报⽂的Content-Type属性来获取编码
2.从返回的html页⾯中匹配编码
使⽤正则模块来匹配html 标签中的编码格式
3.通过w3lib模块来实现终极encoding
⼯具类
下⾯是我写的⼀个⼯具类,在长时间的使⽤场景下,⼏乎解决了所有的编码问题,直接调⽤convert_garbled_text()⽅法,传⼊respon对象
即可⾃动转码
html_
import re
import requests
from requests import Respon
from ng import html_to_unicode, resolve_encoding
"""
字符编码⼯具类,提供解析⽹页,字符串编码⼯具
"""
_reg = r'chart="?(?P
_reg = r'chart="?(?P
def to_unicode(text, encoding=None, errors='strict'):
"""
转换unicode编码
"""
if isinstance(te朋组词 xt, str):
return text
if not isinstance(text, (bytes, str)):
rai TypeError('to_unicode must receive a bytes or str '
f'obj一句话自我介绍 ect, got {type(text).__name__}')
if encoding is None:
encoding = 'utf-8'
return (encoding, errors)
def auto_detect_fun(text):
"""
识别⽂本范围
@param text: ⽂本
@return: 转换编码
"""
for enc in ('ascii', 'utf-8', 'cp1252'):
try:
(enc)
except UnicodeError:
continue
return resolve_encoding(enc)
def find_html_chart(string: str):
"""
从相关字符串⽐如⽹页内容,content-type 中寻找 chart
:param string: 有编码⽅式的⽂本
:return: 返回chart
"""
if len(string) == 0:
return None
field = (_reg, string)
if field:
return ("chart")
def validate_chart(chart: str):
"""
校正编码⽅式
:param chart: 获得的编码
:return:True or Fal
"""
if not chart:
return None
chart = ().lower()
return resolve_encoding(chart) or Fal
def body_inferred_encoding(resp: Respon):
"""
转换乱码 respon
@param resp:
@re黔驴技穷的故事 turn: 转换的⽂本
"""
encoding, convert_body = html_to_unicode(
to_unicode(('Content-Type', '')),
t,
auto_detect_fun=auto_detect_fun,
auto_detect_fun=auto_detect_fun,
default_encoding='ascii'
)
return encoding, convert_body
def convert_garbled_text(resp: Respon) -> str:
"""
转换乱码⽂本
:param resp: 返回的响应
:return: 返回chart
"""
try:
chart = None
if s:
chart = validate_chart(
find_html_chart(to_unicode(("Content-Type", ''))))
if not chart:
chunk = [:4096]
繁星春水思维导图 chart = validate_chart(find_html_chart(chunk))
if not chart:
chart, convert_text = body_inferred_e退休返聘 ncoding(resp)
el:
convert_text = html_to_unicode(f'chart={chart}', t)[1]
ng = chart # 重新赋值编吃什么可以增强记忆力 码
return convert_text
except Exception as ex:
rai RuntimeError(f"convert text error: {ex}")
if __name__ == '__main__':
# 案例1
respon = ('/42/')
# print() # 使⽤原本的.text乱码
print(convert_garbled_text(respon))
# 案例2
req = ("")
# print() # 使⽤原本的.text乱码
print(body_inferred_encoding(req)[1]) # 调⽤convert_garbled_text转换失败,可以调⽤body_inferred_encoding
本文发布于:2023-04-28 11:51:13,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/89/852827.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |