2013-03-16 81 views
1

我已經做到了這一點:BeautifulSoup - 而不是預期的輸出

>>> from bs4 import BeautifulSoup; import urllib2 
>>> data = urllib2.urlopen('http://api.stackexchange.com/docs/').read() 
>>> soup = BeautifulSoup(data.replace('""','"')) # there are errors on page 
>>> soup.prettify() 
<!DOCTYPE HTML> 
<html lang="en"> 
............... # cut short 
</html> 

data似乎是正常的和預期。問題出在soup

soup.prettify()不輸出包含數據中所有內容的字符串。好像soup不是解析(或不管它)整個字符串。

如果您檢查網頁的來源和soup.prettify()的輸出,您會發現它們不匹配。
這裏發生了什麼?爲什麼?

我有一種感覺,我不是很清楚在這篇文章中,如果是這樣,請評論。我會盡力詳細說明。否則隨意刪除這句話...


更新
在答覆FakeRainBrigand評論,我想說,即使在使用瀏覽器保存的HTML,問題仍然存在。 ..所以,即使這有同樣的問題:

data = open('Stack Exchange API.htm').read() 
+0

看來,SO發出了一個不同的頁面,不同的用戶代理。這不是BS的錯;問題出現在你使用urllib2下載頁面的第2行。請參閱此解釋[更改用戶代理](http://stackoverflow.com/q/802134/1074592)(在這種情況下由於缺少robots.txt文件而允許)。 – FakeRainBrigand 2013-03-16 12:08:41

+0

那麼即使在保存頁面的HTML,並使用它,問題仍然存在...更新.. – pradyunsg 2013-03-16 12:14:25

回答

0

您還沒有比在Python默認的(這是真的不是很大)安裝任何其他HTML解析器。

pip install lxml 

並重新載入所有內容,BeautifulSoup將自動獲取lxml並使用它來解析HTML。這對我來說很有用,沒有引號改寫(這是一個標誌着某事正在進行)。

(的HTML可能是打破了一些奇怪的方式和Python的HTML解析器是不是很大的理解之類的事情,即使有BS4的幫助。)

+0

是的,你是對的,我的問題現在解決thx。 – pradyunsg 2013-03-16 12:59:14