python爬虫-彻底解决网页乱码

更新时间:2023-04-28 11:51:13 阅读: 评论:0


2023年4月28日发(作者:时光清浅岁月安暖)

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 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图