使用Python3中的HTMLParser解析HTML

时间:2013-04-24 07:30:32

标签: linux windows parsing python-3.x html-parsing

我在Python 3中有一段代码用Windows中的HTMLParser成功解析HTML,问题是我想在Linux中运行该脚本,但它似乎没有用。

我使用以下内容检索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 \\

我尝试使用re删除多余的\ re.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中解析它?

1 个答案:

答案 0 :(得分:2)

在python3中,您无法将bytes转换为str,就像您正在做的那样:

html_str = str(html)

这在python2中有效,因为bytesstr是相同的,但现在你将获得原始字符串的表示。要解码字符串,您需要提供encoding参数,或使用:

hmtl_str = html.decode(encoding)

如果您无法从http标头中获取字符集,则可以尝试猜测,或使用chardet来确定正确的编码。