2017-07-28 34 views
3

BeautifulSoupに関する本とドキュメントがあります。どちらも、find/findメソッドを連鎖させて、添え字を使って1ページのスクレープから欲しいものを正確に得ることができるはずだと言います。これは当てはまるとは思われません。次の表を参照してください。すべての表の行についてBeautifulSoupでチェーンを見つけることができません。

<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> 

、Iは、第1の要素、第一のネストされたタグの内部テキストを取得する必要があります。 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()と申し訳ありません、私はあなたが持っているので、いつも私は申し訳ありません、私はに新しいミリアンペア

それをループし、リストを返す

find_all方法を実証するrequestsモジュールを使用を使用します私は答えを書く方法を知りません。とにかく私はコードがあなたの疑問を解決すると信じています

+0

間違いなく正しいトラックにあり、謝罪の必要はありません。私は誰にでも話すことができませんが、私の経験では、ここではほとんどが友好的です。あなたの返信は私を近づけてしまった。出力は名前のリスト(良い)ですが、順序が間違っていて、回答セットに望ましくない名前が含まれているので、次のタスクでそれを並べ替えることになります。あなたの助けなしには不可能でした。本当にありがとう! :) – Ryan

関連する問題