2011-11-12 17 views
2

我對Python和一般編程相當陌生。我已經完成了一些教程,並且通過一本相當不錯的書大約2/3。這就是說,我一直試圖通過在std lib中嘗試一些東西來讓Python更適應並且進行編程。爲什麼b'(有時是b「)在我分離一些HTML源文件時出現[Python]

這樣說我最近遇到一個奇怪的怪癖,我敢肯定,是我自己不正確或未「Python的」使用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'

我並不是真的想完成某些特定的事情,只是試圖熟悉std lib。我想知道爲什麼這個b'有前綴

也獎金 - 有沒有更好的方式來獲取HTML源代碼而不使用第三方模塊。我知道所有關於不重新發明輪子的爵士樂,但我試圖通過「構建我自己的工具」學習爵士樂。

在此先感謝!

回答

7

「b」前綴表示類型是字節而不是str。要將字節轉換爲文本,請使用解碼方法並命名適當的編碼。編碼通常在「內容類型」標頭中找到:

>>> 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作爲默認值。

2

b''是一個文字字節對象。內存中沒有b''對象,只有bytes。它只是源代碼中字節對象的符號。源代碼中的簡單引號''創建'str'對象(Unicode字符串)。

如果bytes對象代表一個文本(而不是二進制數據,如圖像),那麼一般來說,你應該儘快解碼爲Unicode字符串。 You should know the character encoding of the text

HTML解析器(如lxml.html,BeautifulSoup)可能會將字節轉換爲Unicode,而無需您干預。

如果您不知道編碼,那麼檢測它可能不是微不足道的,例如,閱讀how feedparser detects character encoding [2006]

相關問題