2017-09-19 5 views
-1

私はBS3での抗議のリストをウェブサイト上のいくつかの情報を引き出そうとしていますが、すべてを正しく取得する方法を覚えておくのに苦労しています。最終的には、各イベントを以下の情報を含むCSVに入れたい:PythonとBeautifulSoup 3のイベントページから基本的な抗議情報を取得する

datetimeとして '2011-01-10'、抗議のリンク ''、抗議の名前 'Cattle Rancher's Demo'、位置ID '1728 '、ロケーション名' City Hall '、そして最も重要なのは、国名「マダガスカル」です。次のように

ページのコードは次のとおりです。

<li><article class="protest"><div class="rdf5"><div itemscope itemtype="Protest"><span style="display:none;"><time itemprop="startDate" datetime="2011-01-10T00:00">2011-01-10T00:00</time></span><p class="flag"><img src=/images/flags/flagger.gif></p> <span> 2011 /</span><br /><a href="/protests/" itemprop="url summary">Cattle Rancher's Demo</a> at ​<span itemprop="location" itemscope itemtype="organization"><span itemprop="name"><a href=/location.aspx?id=1728>City Hall</a></span>/<span itemprop="address" itemscope itemtype="address"><a href=/protests.aspx?ai=10><span itemprop="country-name">Madagscar</span></a></span></div></article></li> 

私は正常例えば、個々の要素を引き出すことができます。

for event in soup.findAll("span", itemprop="country-name"): 
    print event.contents[0] 

しかし、私が本当にしたいことは、クラスでそれぞれ全体の記事ブロックを呼び出すことです私は一緒にcsvの行として書き留めておきたいと思います。だから私はこれをやろうとしました...

for article in soup.findAll('article', class_="protest"): 
    country = soup.find("span", itemprop="country-name") 
    print country 
    datetime = 
    etc 

...しかしそれは失敗します。私はそれがちょうど最初の1を取得と思うので、次に、それは時代の同じ国の数百を返し そして私は単に「記事」上のfindAllを使用する場合、私はそれを得ることができたが...

for article in soup.findAll('article'): 

...国x回を引く(ここで、xはページにある記事要素の数です)。

もし誰かが、例えば各国の記事ブロックの国と日時のようになったら、残りの部分を把握できると思います。

+0

'soup.find(" span "、itemprop =" country-name ")' to 'article.find ( "span"、itemprop = "country-name") ' –

+1

BS3を本当に使用しているのであれば、BS4へのアップグレードを検討するべきです... –

+0

ありがとう@akashkarothiya私はその方法を試してみますが、答え?また感謝ジョン、以前私は他のすべてにBS4を使っていましたが、長いマシンではなぜ私はそれをBS3にする必要がありますか - 私は機械をシフトするときにコードを更新しますが、 –

答えて

0

私が見つけた美しいスープを扱う方法は、マークアップを処理する際に抽出する部分を追加し続けます。サブ要素を選択してループに印刷し、ビットを選択してから、それを変数に保存し、私が望む次のビットに移動します。私はあなたの第二のループが "失敗"するかどうかはわかりません。あなたがその方法で保存していれば、あなたはそこにいると確信しています。

import datetime 
import pandas as pd 
import bs4 

html = r""" 
<li><article class="protest"><div class="rdf5"><div itemscope itemtype="Protest"><span style="display:none;"><time itemprop="startDate" datetime="2011-01-10T00:00">2011-01-10T00:00</time></span><p class="flag"><img src=/images/flags/flagger.gif></p> <span> 2011 /</span><br /><a href="/protests/" itemprop="url summary">Cattle Rancher's Demo</a> at ​<span itemprop="location" itemscope itemtype="organization"><span itemprop="name"><a href=/location.aspx?id=1728>City Hall</a></span>/<span itemprop="address" itemscope itemtype="address"><a href=/protests.aspx?ai=10><span itemprop="country-name">Madagscar</span></a></span></div></article></li> 
""" 

protests = [] 

soup = bs4.BeautifulSoup(html, "lxml") 
for article in soup.findAll('article', class_="protest"): 
    protest_date = datetime.datetime.strptime(article.find("time").text, "%Y-%d-%mT%H:%M").date() 

    protest_link = article.find("a", itemprop="url summary") 
    protest_link_id = protest_link["href"].replace("/protests/", "") 
    protest_link_name = protest_link.text 

    location_wrapper = article.find("span", itemprop="location") 
    location_link = location_wrapper.find("span", itemprop="name").find("a") 
    location_id = location_link["href"].replace("/location.aspx?id=", "") 
    location_name = location_link.text 

    country_link = location_wrapper.find("span", itemprop="address").find("a") 
    country_name = country_link.find("span", itemprop="country-name").text 

    protests.append((protest_link_id, protest_link_name, protest_date, location_id, location_name, country_name)) 

pd.DataFrame(protests, columns=["protest_link_id", 
           "protest_link_name", 
           "protest_date", 
           "location_id", 
           "location_name", 
           "country_name"]).to_csv("protests.csv") 

私はちょうどBS4と3.6のためですが、あなたのアイデアを取得し、プロセスを変換することができるはずです上記の、あなたがBS3とのpython 2.6を使用しているに気づきました。そして実際にはakashはあなたのループがうまくいかない理由を正確に突き止めました。ループを変更する必要がありますarticle.find(...)

+0

ありがとう@ ken-syme ...ちょうどそれを行って:) –

+0

はい!それは基本的に動作します!出力のためにパンダを使って楽しいことがたくさんありません。私は追加したいですが、残りは素晴らしいです...ありがとう! :) –

関連する問題