我对Python和编程很新。我做了一些教程,通过一本非常好的书大约2/3。话虽如此,我一直试图通过在std lib中尝试一些东西来更加熟悉Python和程序设计。
据说我最近遇到了一个奇怪的怪癖,我确信这是我自己的错误或不正确的结果 - " pythonic"使用urllib模块(使用Python 3.2.2)
import urllib.request
HTML_source = urllib.request.urlopen(www.somelink.com).read()
print(HTML_source)
当这个位通过活动解释器运行时,它返回somelink的HTML源代码,但是它前缀为b' 例如
b'<HTML>\r\n<HEAD> (etc). . . .
如果我将字符串按空格分成一个列表,它会在每个项目前加上b&#39;
我并没有真正尝试完成某些特定的事情,只是想让自己熟悉std lib。我想知道为什么这个b&#39;正在加上前缀
还有奖励 - 有没有更好的方法来获取HTML源而不使用第三方模块。我知道所有那些关于不重新发明轮子的爵士乐,不过是我试图通过构建自己的工具来学习#34;
提前致谢!
答案 0 :(得分:7)
“b”前缀表示类型为 bytes 而不是 str 。要将字节转换为文本,请使用 decode 方法并命名相应的编码。编码通常位于“Content-Type”标题中:
>>> u = urllib.request.urlopen('http://cnn.com')
>>> u.getheader('Content-Type')
'text/html; charset=UTF-8'
>>> html = u.read().decode('utf-8')
>>> type(html)
<class 'str'>
如果您在标头中找不到编码,请尝试 utf-8 作为默认设置。
答案 1 :(得分:2)
b''
是一个文字字节对象。内存中没有b''
个对象,只有bytes
。它只是源代码中字节对象的表示法。源代码中的普通引号''
创建'str'对象(Unicode字符串)。
如果bytes
对象表示文本(不是图像等二进制数据),则通常应尽快将其解码为Unicode字符串。 You should know the character encoding of the text
lxml.html
,BeautifulSoup
等HTML解析器可能会在没有您干预的情况下将字节转换为Unicode。
如果您不知道编码,那么检测编码可能并不重要,例如,阅读how feedparser detects character encoding [2006]。