2013-07-25 112 views
7

我想用BeautifulSoup从html文档中获取一些文本。对于我来说,这是一个非常相关的例子,它引发了一个奇怪而有趣的结果:在某个点之后,汤里充满了文本中的额外空间(一个空格将每个字母与下一个字母分开)。我试图搜索网络,以找到一个原因,但我只遇到了一些关于相反错误的消息(根本没有空格)。BeautifulSoup返回意外的额外空间

你有什么建议或暗示它为什么发生,以及如何解决这个问题?

这是我创造了非常基本的代码:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova) 
print soup 

这是从结果中的线,线哪里这个问题开始出现:

值= \” Giuseppe Labbate ogm?non vorremmo nuovi uccelli chiamati lontre \“> < input onmouseover = \”Tip('< cen terclass = \''title _ video \''> <b> G iuseppelabbateo g m? N 2 OÑvöR Ré米M O对N个U 0伏I U C C E的L-升I C H I一米的T I L O,N t个řË<

+2

你为什么要印刷'ultrasoup'?它不应该是'汤'吗? – svineet

+0

与其他网站的问题相同。我仍然试图找出这是BeautifulSoup还是基础lxml的问题。该软件在32位-python上运行时没有问题,并且在64位时失败。 – Matthias

+0

我为'ultraoup'道歉,只是一个小错误。当然,正确的代码是'打印汤' –

回答

10

我相信这是与LXML的HTML解析器的一个错误。 Try:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen ("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova.replace('ISO-8859-1', 'utf-8')) 
print soup 

这是解决问题的方法。 我相信这个问题在lxml 3.0 alpha 2和lxml 2.3.6中得到解决,因此可能值得检查是否需要升级到更新版本。

如果你想在错误的更多信息它最初提起这里:

https://bugs.launchpad.net/beautifulsoup/+bug/972466

希望这有助于

海登

+0

这是完美的工作,谢谢。在这种情况下,我可以问你替换什么东西?还有一个问题:beautifulsoup总是采用lxml html解析器?如果没有,为什么我使用它,以及如何控制我采用的解析器?我认为这些可能会显示为虚拟问题,但我是一个初学html解析器 –

+0

@Hayden:丑陋的,但一个工作的解决方案。感谢那。 – Matthias

4

可以指定解析器html.parser

soup = BeautifulSoup(prova, 'html.parser') 

另外你可以指定html5解析器:

soup = BeautifulSoup(prova, 'html5') 

没有安装html5解析器了吗?从终端安装:

sudo apt-get install python-html5lib 

xml解析器可以使用(soup = BeautifulSoup(prova, 'xml')),但你可能会看到像multi-valued attributes一些class="foo bar"差异。