0

我在 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

正如你所看到的,我有几个\\nWindows 并不在乎它们,但对于 Linux,它们是转义序列,因此无法解析 html。我现在不记得确切的错误,但它类似于can't parse \\

我已经尝试使用re删除多余的\withre.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

知道如何删除多余的\inhtml_str以便在 Linux 中解析它吗?

4

1 回答 1

2

在 python3 中,你不能像你正在做的那样bytes转换:str

html_str = str(html)

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

hmtl_str = html.decode(encoding)

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

于 2013-04-24T14:52:59.710 回答