2012-04-25 49 views
8

テーブルデータをCSVファイルにスクラップしようとしています。残念ながら、私はロードブロックを打ちました。次のコードは、後続のすべてのTRの最初のTRからTDを単に繰り返すだけです。Python beautifulsoupテーブルを反復処理する

import urllib.request 
from bs4 import BeautifulSoup 

f = open('out.txt','w') 

url = "http://www.international.gc.ca/about-a_propos/atip-aiprp/reports-rapports/2012/02-atip_aiprp.aspx" 
page = urllib.request.urlopen(url) 

soup = BeautifulSoup(page) 

soup.unicode 

table1 = soup.find("table", border=1) 
table2 = soup.find('tbody') 
table3 = soup.find_all('tr') 

for td in table3: 
    rn = soup.find_all("td")[0].get_text() 
    sr = soup.find_all("td")[1].get_text() 
    d = soup.find_all("td")[2].get_text() 
    n = soup.find_all("td")[3].get_text() 

    print(rn + "," + sr + "," + d + ",", file=f) 

これは私の初めてのPythonスクリプトですので、何か助けていただければ幸いです!私は他の質問の答えを見てきましたが、私がここで間違っていることを理解することはできません。

答えて

26

あなたが尋ねるときは、例えば、そう、あなたのドキュメントのトップレベルで、すべての「TD」 `タグを使用すると、すべての「TD」のタグを取得しているが、あなたがfind()find_all()を使用するたびに開始しています文書では、は検索したテーブルと行のものだけではありません。あなたのコードが書かれた方法で使用されていないので、それらを検索しないかもしれません。

私はあなたがこのような何かをしたいと思う:

table1 = soup.find("table", border=1) 
table2 = table1.find('tbody') 
table3 = table2.find_all('tr') 

それとも、あなたが知っている、より多くのこのような何か、ブートにより説明変数名と:

rows = soup.find("table", border=1).find("tbody").find_all("tr") 

for row in rows: 
    cells = row.find_all("td") 
    rn = cells[0].get_text() 
    # and so on 
6

問題があることです検索を絞り込むたびに(このtrなどの最初のtdを取得する)、代わりにスープに戻ってくるだけです。スープはトップレベルのオブジェクトで、ドキュメント全体を表します。一度スープに電話して、スープの代わりにその結果を使って次のステップに進んでください。例えば

(変数名と、より明確になるように変更)、

table = soup.find('table', border=1) 
rows = table.find_all('tr') 

for row in rows: 
    data = row.find_all("td") 
    rn = data[0].get_text() 
    sr = data[1].get_text() 
    d = data[2].get_text() 
    n = data[3].get_text() 

    print(rn + "," + sr + "," + d + ",", file=f) 

私はprint文を使用すると、非常に(ここでは何をしようとして行うための最善の方法であることはよく分かりません少なくとも、追加の代わりに文字列の書式を使用する必要がありますが、それはコアの問題ではないためそのまま残しています)。

また、完了:soup.unicodeは何もしません。あなたはそこでメソッドを呼び出すのではなく、割り当てはありません。私はBeautifulSoupが最初にunicodeというメソッドを持っているのを覚えていませんが、私はBS 3.0に慣れているので、4で新しいかもしれません。

関連する問題