Python:将二进制文件打印为字符串

Python:将二进制文件打印为字符串,python,Python,我有一个爬虫,它解析给定站点的HMTL并打印部分源代码。这是我的剧本: #!/usr/bin/env python # -*- encoding: utf-8 -*- from bs4 import BeautifulSoup import requests import urllib.request import re class Crawler: headers = {'User-Agent' : 'Mozilla/5.0'} keyword = 'arroz'

我有一个爬虫,它解析给定站点的HMTL并打印部分源代码。这是我的剧本:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
import urllib.request
import re

class Crawler:

    headers = {'User-Agent' : 'Mozilla/5.0'}
    keyword = 'arroz'

    def extra(self):
        url = "http://buscando.extra.com.br/search?w=" + self.keyword
        r = requests.head(url, allow_redirects=True)    
        print(r.url)
        html = urllib.request.urlopen(urllib.request.Request(url, None, self.headers)).read()
        soup = BeautifulSoup(html, 'html.parser')
        return soup.encode('utf-8')

    def __init__(self):
        extra = self.extra()
        print(extra)

Crawler()
我的代码工作正常,但它在打印源代码时,在值之前有一个恼人的
b'
。我已经尝试过使用
解码('utf-8')
,但没有成功。有什么想法吗

更新

如果我不使用
编码('utf-8')
我会出现以下错误:

Traceback (most recent call last):
  File "crawler.py", line 25, in <module>
    Crawler()
  File "crawler.py", line 23, in __init__
    print(extra)
  File "c:\Python34\lib\encodings\cp850.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2030' in position
13345: character maps to <undefined>
回溯(最近一次呼叫最后一次):
文件“crawler.py”,第25行,在
爬虫
文件“crawler.py”,第23行,在_init中__
打印(额外)
文件“c:\Python34\lib\encodings\cp850.py”,第19行,编码
返回codecs.charmap\u encode(输入、自身错误、编码\u映射)[0]
UnicodeEncodeError:“charmap”编解码器无法将字符“\u2030”编码到位
13345:角色映射到

当我按照给定的方式运行代码时,除了将
返回汤.encode('utf-8')
替换为
返回汤
,它工作正常。我的环境:

  • 操作系统:Ubuntu
    15.10
  • Python:
    3.4.3
  • python3 dist包bs4版本:
    beautifulsoup4==4.3.2
这让我怀疑问题在于您的环境,而不是您的代码。您的堆栈跟踪提到了
cp850.py
,并且您的源代码正在访问一个
.com.br
站点-这让我觉得shell的默认编码可能无法处理unicode字符。这是你的维基百科页面

您可以检查终端使用的默认编码:

>>> import sys
>>> sys.stdout.encoding
我的终端响应为:

'UTF-8'
我想你的不会,这是你遇到的问题的根源

编辑

事实上,我可以通过以下方法完全复制您的错误:

>>> print("\u2030".encode("cp850"))
这就是问题所在-由于计算机的区域设置,
print
隐式转换为系统的默认编码,并引发UnicodeDecodeError


从命令提示符更新窗口以显示unicode字符有点超出了我的驾驶室范围,因此我无法提供任何建议,只能指导您使用。

那么您为什么在此处使用
encode
?尝试一下
return-soup
。如果不这样做,它将返回以下错误:
Traceback(最后一次调用):文件“crawler.py”,第25行,在crawler()文件“crawler.py”中,第23行,在uuu init_uuuuuuuuuu打印(额外)文件“c:\Python34\lib\encodings\cp850.py”中,第19行,在encode return codes.charmap\u encode中(输入,self.errors,encoding_map)[0]UnicodeEncodeError:“charmap”编解码器无法对13345位置的字符“\u2030”进行编码:字符映射到
字节
在Python 3中没有
编码
方法,因此您从字符串开始,并将其转换为字节string@chucksmash使用
编码('utf-8')
我已经停止了上面的错误。但是我已经创建了一个新错误:
UnicodeEncodeError:“charmap”编解码器无法对13345位置的字符“\u2030”进行编码:字符映射到
。是的!它返回了
cp850
。我该怎么办?我已经尝试了链接解决方案,但没有成功…谢谢。