当我分割一些HTML源代码时,为什么会出现b'(有时是b'')[Python]

时间:2011-11-12 04:05:35

标签: python parsing python-3.x

我对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;

提前致谢!

2 个答案:

答案 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.htmlBeautifulSoup等HTML解析器可能会在没有您干预的情况下将字节转换为Unicode。

如果您不知道编码,那么检测编码可能并不重要,例如,阅读how feedparser detects character encoding [2006]