我正在抓取本地html文档。但是,当我用漂亮的汤解析它时,它以无法解析的丑陋(如下图所示)格式返回html。
我使用的简单代码是:
path = 'alerts/myfile.htm'
file = open(os.path.abspath(path))
parser = BeautifulSoup(file,'html.parser')
file.close()
这件事使我发疯。您遇到过同样的问题吗? 谢谢
答案 0 :(得分:1)
在我看来,有关源文件编码的问题。
加载文档时,BeautifulSoup使用名为Unicode Dammit的子库将其转换为UTF-8。
可能是您的文件已使用不同的编码保存,并且转换中发生了某种错误。
由于我手头没有html,因此建议您调查文件是ASCII还是Unicode或任何其他编码,然后使用以下方法解析文件:
encoding = <your encoding here> (example "iso-8859-8")
parser = BeautifulSoup(file,'html.parser', from_encoding=encoding)
可以找到其他编码选项here
致谢
更新
也尝试:
parser = BeautifulSoup(file,'html.parser', from_encoding='utf-8')
答案 1 :(得分:1)
看起来原始文件位于UTF-16中。
无论出于何种原因,BeautifulSoup(..., from_encoding='utf-16le')
都不了解这种情况,但是您可以通过在将文件传递给BS之前手动读取和解码文件来解决此问题。
有关转录本的信息,请参见下文,我在其中创建了一个UTF-16LE的HTML文件,转储其内容,尝试将其直接传递到BS4中,最后使用上述解决方法。
$ echo '<html><div>hello</div></html>' | iconv -f utf-8 -t utf-16le > y.html
$ file y.html
$ xxd y.html
00000000: 3c00 6800 7400 6d00 6c00 3e00 3c00 6400 <.h.t.m.l.>.<.d.
00000010: 6900 7600 3e00 6800 6500 6c00 6c00 6f00 i.v.>.h.e.l.l.o.
00000020: 3c00 2f00 6400 6900 7600 3e00 3c00 2f00 <./.d.i.v.>.<./.
00000030: 6800 7400 6d00 6c00 3e00 0a00 h.t.m.l.>...
$ python
>>> import bs4
>>> s = bs4.BeautifulSoup(open('y.html'))
<html><div>hello</div></html>
>>> s = bs4.BeautifulSoup(open('y.html'), from_encoding='utf-16le')
<html><div>hello</div></html>
>>> s = bs4.BeautifulSoup(open('y.html'), 'html.parser', from_encoding='utf-16le')
<html><div>hello</div></html>
>>> d = open('y.html', 'rb').read().decode('utf-16le')
>>> d
'<html><div>hello</div></html>\n'
>>> s = bs4.BeautifulSoup(d)
>>> s
<html><div>hello</div></html>
>>>
答案 2 :(得分:1)