当前位置: 首页 > 面试题库 >

在Python中获取HTTP响应的字符集/编码的好方法

张森
2023-03-14
问题内容

寻找一种简单的方法来使用Python urllib2或任何其他Python库获取HTTP响应的字符集/编码信息。

>>> url = 'http://some.url.value'
>>> request = urllib2.Request(url)
>>> conn = urllib2.urlopen(request)
>>> response_encoding = ?

我知道有时它会出现在“ Content-Type”标头中,但是该标头还有其他信息,并且它嵌入了我需要解析的字符串中。例如,Google返回的Content-
Type标头是

>>> conn.headers.getheader('content-type')
'text/html; charset=utf-8'

我可以解决这个问题,但是我不确定格式的一致性。我很确定charset可能会完全丢失,所以我必须处理这种情况。某种从“
utf-8”中分离出来的字符串拆分操作似乎是做这种事情的错误方法。

>>> content_type_header = conn.headers.getheader('content-type')
>>> if '=' in content_type_header:
>>>  charset = content_type_header.split('=')[1]

那种代码感觉像是在做太多的工作。我也不确定是否在每种情况下都可以使用。有谁有更好的方法来做到这一点?


问题答案:

要解析http标头,您可以使用cgi.parse_header()

_, params = cgi.parse_header('text/html; charset=utf-8')
print params['charset'] # -> utf-8

或使用响应对象:

response = urllib2.urlopen('http://example.com')
response_encoding = response.headers.getparam('charset')
# or in Python 3: response.headers.get_content_charset(default)

通常,服务器可能会说谎或根本不报告编码(默认取决于内容类型),或者可能在响应正文中指定编码,例如<meta>html文档中的元素或xml文档的xml声明中的元素。作为最后的选择,可以从内容本身猜测编码。

您可以requests用来获取Unicode文本:

import requests # pip install requests

r = requests.get(url)
unicode_str = r.text # may use `chardet` to auto-detect encoding

BeautifulSoup解析html(并转换为Unicode作为副作用):

from bs4 import BeautifulSoup # pip install beautifulsoup4

soup = BeautifulSoup(urllib2.urlopen(url)) # may use `cchardet` for speed
# ...

bs4.UnicodeDammit直接获取任意内容(不一定是html):

from bs4 import UnicodeDammit

dammit = UnicodeDammit(b"Sacr\xc3\xa9 bleu!")
print(dammit.unicode_markup)
# -> Sacré bleu!
print(dammit.original_encoding)
# -> utf-8


 类似资料:
  • 我需要保存通过json发送的响应代码,例如404: 我尝试使用以下代码: 但是laravel告诉我这个错误: 非静态方法Symfony\Component\HttpFoundation\Response::getStatusCode()不应静态调用

  • 我从JMeter调用一个登录API,返回json格式的结果。对于这个API调用,我得到了预期的结果,但是json响应包含ï»字符。在我添加的请求中,DataType:json和Content-Type:application/json;字符集=utf-8。 任何建议。 输出Json响应

  • 问题内容: 将编码的字符串添加到http共振似乎将某些字符替换为!F(MISSING)。如何预防? 输出: {“ encodedText”:“ M6c8RqL61nMFy%!F(MISSING)hQmciSYrh9ZXgVFVjO”} 码: 问题答案: 您正在使用转义值“ M6c8RqL61nMFy%2FhQmciSYrh9ZXgVFVjO”作为以下行上的格式字符串: Fprintf尝试格式化动词

  • 问题内容: 如何在对UTF-8的回复中设置默认字符编码? 我已经试过了 还有这个 都不起作用-响应仍与标头一起发送 我想对所有text / html响应都执行此操作,理想情况下是使用代码而不是XML。我正在使用Jetty 9。 问题答案: Jetty文档声称它默认情况下使用UTF-8,但这似乎是一个谎言。如果执行normal ,则内容编码如下确定。 从content-type到content-en

  • 问题内容: 我正在使用python 2.7,我想解析已经从文本文件中提取的字符串HTTP响应字段。最简单的方法是什么?我可以使用BaseHTTPServer解析请求,但无法为响应找到内容。 我的回复非常标准,并采用以下格式 提前致谢, 问题答案: 您可能会发现这很有用,请记住HTTPResponse并非旨在“由用户直接实例化”。 还要注意,响应字符串中的content- length标头可能不再有

  • 我正在使用JMeter执行负载测试,用户应该执行启动-登录- clk仪表板页面- clk登录页面(登录后出现的页面,即主页),其中clk仪表板和clk登录页面重复操作5次。 直到30个用户,当我增加用户负载时,我没有收到任何错误,我开始收到错误,因为 响应代码:非HTTP响应代码:org.apache.HTTP.conn.HttpHostConnectException响应消息:非HTTP回应消息