2013-08-30 37 views
1

當解析http://en.wikipedia.org/wiki/Israel我遇到一個H2標籤,該標籤具有文本,但美麗的湯返回None類型吧:美麗的湯沒有找到字符串

$ python 
Python 2.7.3 (default, Apr 10 2013, 05:13:16) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import bs4 
>>> import requests 
>>> from pprint import pprint 
>>> response = requests.get('http://en.wikipedia.org/wiki/Israel') 
>>> soup = bs4.BeautifulSoup(response.content) 
>>> for h in soup.find_all('h2'): 
...  pprint(str(type(h))) 
...  pprint(h) 
...  pprint(str(type(h.string))) 
...  pprint(h.string) 
...  print('--') 
...      
"<class 'bs4.element.Tag'>" 
<h2>Contents</h2>  
"<class 'bs4.element.NavigableString'>" 
u'Contents'   
--     
"<class 'bs4.element.Tag'>" 
<h2><span class="mw-headline" id="Etymology"><span id="Etymology"></span> Etymology</span></h2> 
"<type 'NoneType'>" 
None     
--     
"<class 'bs4.element.Tag'>" 
<h2><span class="mw-headline" id="History">History</span></h2> 
"<class 'bs4.element.NavigableString'>" 
u'History'   
-- 

請注意,這不是一個解析的問題,美麗的湯解析文件很好。爲什麼第二個H2元素返回None類型?是否由於字符串中的前導「」(空格)?我該如何解決這個問題?這是在Python 2.7上的Beautiful Soup 4,Kubuntu Linux 12.10。

+0

二號H2有2跨度空單用id ethymology。可能bsoup失敗這一個。 – 2013-08-30 14:35:49

+0

我也注意到這一點。怎麼可能我圍繞它編碼? – dotancohen

+0

能夠幫助你我需要挖掘文檔,因爲我從不使用bs4 - 如果你不急,我可以嘗試。 – 2013-08-30 14:40:37

回答

1

我回答第一個上半年,什麼是錯的......

documentation of bs4引述:「如果一個標籤包含一個以上的事情,那麼,目前還不清楚應該是指什麼.string,所以.string被定義爲None「。

而現在的另一半,如何解決它。

從同一來源再次引用:「如果標籤內有多個東西,您仍然可以只看字符串,使用.strings生成器。」更好的是,使用.stripped_strings生成器,連接結果,我想你會得到你想要的。

+0

'.string'/'.stripped_string'不適合我。但'.contents'正在工作並返回我需要的字符串列表。你能解釋這是爲什麼嗎? – user2831683

+0

@ user2831683你能提供一個最小的問題實例嗎?在另一個問題中,如果它很長... – nickie

+0

解決了它。實際上,在我的情況bs4.element.Tag對象有太多的字符串引用,所以它不能決定要返回哪一個字符串。所以它返回'無'。在另一個問題找到確切的解決我的問題。 Thankyou – user2831683

1

我認爲這是因爲第二h2沒有文本,而不是它有一個span作爲一個孩子(和跨度有另一個孩子作爲其子,這使得該h2的孫子。

對於這種基於發電機解析使用屬性,如.stripped_strings.strings

>>> s.find_all('h2') 
[<h2>Contents</h2>, <h2><span class="mw-headline" id="Etymology"><span id="Etymology"></span> Etymology</span></h2>] 
>>> list(s.find_all('h2')[-1].stripped_strings) 
[u'Etymology'] 
+0

您的代碼有效,但理由不正確。如果只有一個「span」(或任何嵌套的「span」列表),那就沒問題了。 – nickie

+0

@nickie你的意思是跨度(而不是垃圾郵件;) – 2013-08-30 14:48:04

+0

其實,第二個'h2'確實有文字,就在''之後。但是,它看起來不是合法的HTML。 – dotancohen