2013-04-24 69 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