2014-01-29 206 views
2

我試圖用BeautifulSoup刮一個網站,但我有一個問題。 我在Python 2.7中完成了一個教程,它有完全相同的代碼,並沒有問題。Python:AttributeError:'NoneType'對象沒有屬性'findNext'

import urllib.request 
from bs4 import * 


htmlfile = urllib.request.urlopen("http://en.wikipedia.org/wiki/Steve_Jobs") 

htmltext = htmlfile.read() 

soup = BeautifulSoup(htmltext) 
title = (soup.title.text) 

body = soup.find("Born").findNext('td') 
print (body.text) 

如果我嘗試運行該程序,我得到,

Traceback (most recent call last): 
    File "C:\Users\USER\Documents\Python Programs\World Population.py", line 13, in <module> 
    body = soup.find("Born").findNext('p') 
AttributeError: 'NoneType' object has no attribute 'findNext' 

這是與Python 3有問題還是我太天真?

+0

你確定你不想'body = soup.find('body')'? –

回答

7

findfind_all方法不搜索文檔中的任意文本,它們搜索HTML標籤。文檔使得清楚了(我的斜體字):


通行證在name的值,你會告訴美麗的湯只考慮標籤某些名稱。文本字符串將被忽略,標籤的名稱不匹配。這是最簡單的用法:沒有findNext()方法

soup.find_all("title") 
# [<title>The Dormouse's story</title>] 

這就是爲什麼你soup.find("Born")將返回None,因此它爲什麼抱怨NoneType(的None類型)。

您引用的那個頁面包含(在寫這個答案的時候)單詞「born」的八個副本,其中沒有一個是標籤。

查看HTML源爲網頁,你會找到最好的選擇可能是尋找正確的跨度:

<th scope="row" style="text-align:left;">Born</th> 
    <td><span class="nickname">Steven Paul Jobs</span><br /> 
    <span style="display:none">(<span class="bday">1955-02-24</span>)</span>February 24, 1955<br /> 
+0

如果你想在html文件中找到一些任意文本,該怎麼辦? – user391339

+0

@ user391339,雖然原來的問題沒有要求,但您可以在字符串化的湯doc上使用常規的Python字符串搜索功能(例如,字符串「find」或正則表達式搜索)漂亮:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#pretty-printing – paxdiablo

5

find方法尋找標記,而不是文字。要查找姓名,生日和出生地,你將不得不擡頭看span元素與相應的類名,並訪問text屬性,該屬性物品:

import urllib.request 
from bs4 import * 


soup = BeautifulSoup(urllib.request.urlopen("http://en.wikipedia.org/wiki/Steve_Jobs")) 
title = soup.title.text 
name = soup.find('span', {'class': 'nickname'}).text 
bday = soup.find('span', {'class': 'bday'}).text 
birthplace = soup.find('span', {'class': 'birthplace'}).text 

print(name) 
print(bday) 
print(birthplace) 

輸出:

Steven Paul Jobs 
1955-02-24 
San Francisco, California, US 

PS :您不必在urlopen上撥打read,BS接受類似文件的對象。

+1

爲了多走一英里,實際給出了代碼,這讓我不能打擾:-) – paxdiablo