Bs4编码问题

2024-04-23 22:49:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想和巴西中央银行的网站合作。你知道吗

我的问题是从通知部分得到数据,什么时候与“互换”(央行在当地市场出售美元以控制国家货币贬值)有关。你知道吗

我在处理API和编码方面遇到了很多麻烦。 这是我们可以找到所有报告的网站部分:http://www.bcb.gov.br/pre/normativos/busca/buscaNormativo.asp?tema=&startRow=0&refinadorTipo=&refinadorRevogado=&tipo=P&tipoDocumento=0&numero=&conteudo=&dataInicioBusca=13%2F6%2F2018&dataFimBusca=16%2F6%2F2018

当我尝试从主页获取html时,我得到了以下结果:

Divulga as condi\u00e7\u00f5es de oferta p\u00fablica para a realiza\u00e7\u00e3o de opera\u00e7\u00f5es de swap

但应该是:

Divulga as condições de oferta pública para a realização de operações de swap.

我试过以下代码:

import requests 
from bs4 import BeautifulSoup as bs
url = 'http://www.bcb.gov.br/pre/normativos/busca/buscaSharePoint.asp?conteudo=swap&startRow=0'

data = requests.get(url)
bsObj = bs(data.content, 'lxml')
bsObj.find("div") #returned the example, with the wrong encode

#你知道吗

bsObj = bs(data.content, 'lxml', from_encoding='latin-1')
bsObj.find("div") #the same

bsObj = bs(data.content, 'lxml', from_encoding='utf-8')
bsObj.find("div") #the same

有人知道发生了什么吗?你知道吗


Tags: thefromdivhttpdatabs网站as
1条回答
网友
1楼 · 发布于 2024-04-23 22:49:33

字符ç是U+00e7,õ是U+00F5,依此类推。这只是同一个字符串的两种不同表示形式。所以,虽然我只是在猜测你的问题,给出了不完整的信息,我认为这是一个有根据的猜测

如果您print这个字符串,您将看到人类可读的版本,带有condições等等(除非您的Python和控制台没有被配置为正确地相互对话,但是如果您使用的是python3.6或更高版本,以及Linux、macOS或Windows的合理的现代版本,这不太可能是一个问题)。你知道吗

但是,如果您只是在交互式解释器中计算字符串,您将得到程序员友好的表示,而不是人类友好的表示。你知道吗

例如:

>>> s = 'Divulga as condições de oferta pública para a realização de operações de swap.'
>>> print(s)
Divulga as condições de oferta pública para a realização de operações de swap.
>>> s
'Divulga as condi\u00e7\u00f5es de oferta p\u00fablica para a realiza\u00e7\u00e3o de opera\u00e7\u00f5es de swap'

后者很好,因为您可以将它作为字符串文本复制并粘贴到源代码中,而且它甚至可以在配置不好的终端上工作,但对于阅读来说就不太好了。你知道吗

技术上的区别是print调用^{},而在交互式解释器中计算字符串时不print调用^{}。你知道吗


同时:大多数网站指定了它们的编码(至少以三种不同方式中的一种……),在这种情况下,如果您使用text而不是content,则requests可以自动正确解码:

bsObj = bs(data.text, 'lxml')

除此之外,做任何事情的唯一原因是如果网站被破坏并且混淆了requests。你知道吗

如果您只是使用data.content,那么BeautifulSoup将使用一个名为unicodedammit的库来试探性地尝试猜测正确的编码。你知道吗

如果您使用data.contentfrom_encoding,那么您必须知道正确的编码,这样才能将其传入。这是一个有用的最后手段,但不应该是第一件事,你转向。你知道吗

我怀疑from_encoding=Latin-1from_encoding=UTF-8实际上没有做同样的事情。他们当然不应该。更可能的是,前者给了你一个不同的,不正确的编码,但你只是没有注意到它是不同的。可能是这样的:

'Divulga as condi\u00c3\u00a7\u00c3\u00b5es de oferta p\u00c3\u00bablica para a realiza\u00c3\u00a7\u00c3\u00a3o de opera\u00c3\u00a7\u00c3\u00b5es de swap.'

如果您不熟悉100000字符的Unicode表(十六进制),那么看起来可能不会有太大的不同,但是如果您print了解它,您会发现它有很大的不同:

Divulga as condições de oferta pública para a realização de operações de swap.

相关问题 更多 >