2017-07-28 54 views
3

我在BeautifulSoup上有一本書和文檔。兩個人都說我應該能夠鏈接find/find_all方法並使用下標來從單個頁面抓取我想要的東西。這似乎並非如此。考慮下表。在BeautifulSoup中無法鏈接查找和find_all

<tr> 
<td><span style="display:none;" class="sortkey">Dresser !</span><span class="sorttext">**<a href="/wiki/Louise_Dresser" title="Louise Dresser">Louise Dresser</a>**</span></td> 
<td><span style="display:none;" class="sortkey">Ship !</span><span class="sorttext"><i><a href="/wiki/A_Ship_Comes_In" title="A Ship Comes In">A Ship Comes In</a></i></span></td> 
<td><span style="display:none;" class="sortkey">Pleznik !</span><span class="sorttext">Mrs. Pleznik</span></td> 
</tr> 
<tr> 
<td><span style="display:none;" class="sortkey">Swanson !</span><span class="sorttext"><a href="/wiki/Gloria_Swanson" title="Gloria Swanson">Gloria Swanson</a></span></td> 
<td><i><a href="/wiki/Sadie_Thompson" title="Sadie Thompson">Sadie Thompson</a></i></td> 
<td><span style="display:none;" class="sortkey">Thompson !</span><span class="sorttext">Sadie Thompson</span></td> 
</tr> 
<tr> 
<th scope="row" rowspan="6" style="text-align:center"><a href="/wiki/1928_in_film" title="1928 in film">1928</a>/<a href="/wiki/1929_in_film" title="1929 in film">29</a><br /> 
<small><a href="/wiki/2nd_Academy_Awards" title="2nd Academy Awards">(2nd)</a></small></th> 
<td style="background:#FAEB86"><b><span style="display:none;" class="sortkey">Pickford !</span><span class="sorttext">**<a href="/wiki/Mary_Pickford" title="Mary Pickford">Mary Pickford</a>**</span> <img alt="Award winner" src="//upload.wikimedia.org/wikipedia/commons/f/f9/Double-dagger-14-plain.png" width="9" height="14" data-file-width="9" data-file-height="14" /></b></td> 

對於每一個錶行,我需要抓住的第一個元素,那麼第一個嵌套的標籤內的文本。 Lousie Dresser將成爲第一個數據點,接下來是Gloria Swanson,然後是Mary Pickford。

我想以下會讓我在那裏,但我錯了,6小時後,我花了。

def getActresses(URL): 
    try: 
     html = urlopen(URL) 
    except HTTPError: 
     print("Page not found.") 
     return None 
    try: 
     bsObj = BeautifulSoup(html, "lxml") 
     soup = bsObj.find("table", {"class":"wikitable sortable"}) 
    except AttributeError: 
     print("Error creating/navigating soup object") 
    data = soup.find_all("tr").find_all("td").find("a").get_text() 
    print(data) 


getActresses("https://en.wikipedia.org/wiki/Academy_Award_for_Best_Actress") 

這不是我試過的唯一代碼。我試着循環遍歷行,然後表數據單元格,然後訪問標籤。我試過要求一個標籤,然後將它們重新排列出來,只是被告知我不能擁有我想要的文本。嘗試連鎖操作時遇到的最常見錯誤(如上所述)爲AttributeError: 'ResultSet' object has no attribute 'find'.即使在複製書籍示例時,下標也不起作用(請參閱圖?!)。另外,我已經讓流程放棄了自己,我不知道這是可能的。

關於正在發生的事情以及爲什麼應該如此簡單的事情似乎是這樣的事件的想法將非常感激。

回答

5
import requests 
from bs4 import BeautifulSoup 

def getActresses(URL): 
    res = requests.get(URL) 

    try: 
     soup = BeautifulSoup(res.content, "lxml") 
     table = soup.find("table", {"class":"wikitable sortable"}) 
    except AttributeError: 
     print("Error creating/navigating soup object") 

    tr = table.find_all("tr") 

    for _tr in tr: 
     td = _tr.find_all("td") 
     for _td in td: 
      a = _td.find_all("a") 
      for _a in a: 
       print(_a.text.encode("utf-8")) 

getActresses("https://en.wikipedia.org/wiki/Academy_Award_for_Best_Actress") 

使用的text代替get_text()和抱歉,我用requests模塊演示

find_all方法總是返回一個列表,以便您通過它

對不起,我是個新的有循環stackoverflow,我不知道如何寫答案。無論如何,我相信代碼將清除你的疑惑

+0

絕對在正確的軌道上,不需要道歉。我不能爲所有人說話,但是我的經驗是,大多數人都很友善。你的回覆讓我關上了。輸出是一個名稱列表(這是很好的),但是它們的順序是錯誤的,並且在答案集中包含了不希望出現的名稱,所以我的下一個任務將對此進行排序,但是即使到那個點也會有沒有你的幫助是不可能的。非常感謝! :) – Ryan

相關問題