2013-04-24 68 views
0

我在Python 3中有一段代碼,它可以在Windows中成功解析HTML和HTMLParser,問題是我想在Linux中運行該腳本,但它似乎不是加工。在Python3中使用HTMLParser解析HTML

我檢索與下面的HTML代碼:

html = urllib.request.urlopen(url).read() 
html_str = str(html) 
parse = MyHTMLParser() 
parse.feed(html_str) 

html原始輸出如下:

b'\n \n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n 
    <html xmlns="http://www.w3.org/1999/xhtml">\n 
     <head>\n 

html是二進制的,所以我將它轉換爲string這樣parse.feed沒有按抱怨。問題是轉換爲字符串時,我得到的HTML是這樣的:

'b\'\\n \\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\\n 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\\n 
<html xmlns="http://www.w3.org/1999/xhtml">\\n 
    <head>\\n 

正如你所看到的,我有幾個\\n,Windows不給一個該死的他們,但他們的Linux '轉義序列,因此無法解析HTML。我不記得確切的錯誤的權利,但它是像can't parse \\

我用rere.sub("\\","",html_str)但在Windows中刪除多餘的\嘗試似乎並沒有做任何事情,在Linux中我得到也是一個錯誤。

這是錯誤在Linux中試圖re.sub當HTML我得到:

>>> re.sub("\\","",html_str) 
Traceback (most recent call last): 
    File "/usr/lib/python3.1/sre_parse.py", line 194, in __next 
    c = self.string[self.index + 1] 
IndexError: string index out of range 

任何想法,我怎麼能去除多餘的\html_str這樣我就可以在Linux的解析呢?

+0

'\\ n'在Linux上不是轉義序列。 '\\ n'是兩個字符,一個反斜槓(轉義爲''\'''使輸出成爲一個有效的Python字節文字)和一個'n'字符。這些字符在Windows和Linux上具有相同的含義。你能查找確切的錯誤和追溯? – 2013-04-24 07:38:10

回答

1

在python3您不能轉換bytesstr像你這樣做:

html_str = str(html) 

這個工作在python2因爲bytesstr是相同的,但現在你會得到原來的表示串。解碼字符串,你要麼需要提供encoding參數,或者使用:

hmtl_str = html.decode(encoding) 

如果你無法從HTTP標頭的字符集,你既可以嘗試猜測,或使用chardet確定正確的編碼。

+0

'html_str = str(html,'ascii')'做了詭計。 – Peter 2013-04-24 15:08:38

+0

請注意'str(html,'ascii')'和'html.decode('ascii')'是一樣的東西。 – 2013-04-26 23:20:52