2013-07-25 165 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"差異。