2017-08-10 16 views
1

これにはいくつか大きなスレッドがありますが(この点のいくつかは私がこの点まで助けてくれました)、なぜ私のプログラムが動作していないのか分かりません。ウェブスクレイピング|美しいスープ|構文解析テーブル

問題:プログラムは機能しますが、すべてのテーブル行をループする必要がある場合は最初の行が返されているようです。私が正しいのPython 3.5

import requests 
from bs4 import BeautifulSoup 
import pandas as pd 

url = "http://www.the-numbers.com/movies/year/2006" 

r = requests.get(url) 
soup = BeautifulSoup(r.content) 

data = [] 

for table_row in soup.select("table"): 
    cells = table_row.find_all(['td']) 
    release_date = cells[0].text.strip() 
    movie_name = cells[2].text.strip() 
    genre_name = cells[3].text.strip() 
    production_budget = cells[4].text.strip() 
    box_office = cells[5].text.strip() 
    movie = {"Release_Date" : release_date, 
      "Movie_Name" : movie_name, 
      "Genre" : genre_name, 
      "Production_Budget" : production_budget, 
      "Box_Office" : box_office} 
    data.append(movie) 
    print (release_date, movie_name, genre_name, production_budget, box_office) 

これは1月を返し、2006ブラッドレインアクション$ 25,000,000 $ 2405420を使用していますが、私は、テーブル内の他のすべての行を必要とする

この問題を解決するのが簡単な場合は、これをPandas DataFrameに取得することが次のステップになります(ただし、レスポンスでは必要ありません)。

ご協力いただければ幸いです。

答えて

3

あなたは、いくつかのデータクリーニングとread_htmlを使用することができます。

df = pd.read_html('http://www.the-numbers.com/movies/year/2006', header=0)[0] 
df = df.dropna(how='all') 
df['Release Date'] = df['Release Date'].ffill() 
print (df.head()) 
    Release Date   Movie Genre ProductionBudget \ 
0 January, 2006   NaN  NaN    NaN 
1  January 6  BloodRayne Action  $25,000,000 
2  January 6  Fateless Drama  $12,000,000 
3  January 6 Grandma's Boy Comedy  $5,000,000 
4  January 6   Hostel Horror  $4,800,000 

    DomesticBox Officeto Date Trailer 
0      NaN  NaN 
1    $2,405,420  NaN 
2     $196,857  NaN 
3    $6,090,172  NaN 
4    $47,326,473  NaN 

あなたのオリジナルソリューション:

data = [] 
#find first table 
tab = soup.select("table")[0] 
#find all tr elements 
rows = tab.find_all(['tr']) 
#loop anf find all td 
for row in rows: 
    cols = row.find_all('td') 
    #parse text 
    cols = [ele.text.strip() for ele in cols] 
    #[:-1] remove last column 
    data.append(cols[:-1]) 

cols = ['Release_Date','Movie_Name','Genre','Production_Budget','DomesticBox'] 
#[2:] remove first 2 rows 
df = pd.DataFrame(data[2:], columns = cols) 
print (df.head()) 
    Release_Date  Movie_Name Genre Production_Budget DomesticBox 
0 January 6  BloodRayne Action  $25,000,000 $2,405,420 
1     Fateless Drama  $12,000,000  $196,857 
2    Grandma's Boy Comedy  $5,000,000 $6,090,172 
3      Hostel Horror  $4,800,000 $47,326,473 
4    Kill the Poor          $0 
+0

これは完璧で、まさに私が望んでいたが。どうもありがとうございました。好奇心のために、私の元のコードが最初の行だけを返す理由を知っていますか? – AdrianC

+0

テーブルが1つだけなので、テーブルではなくtd要素にループが必要だと思います。 – jezrael

+0

それは完璧です - 私を助けてくれてありがとう。非常に感謝し、それは完全に働いた。問題解決済み:) – AdrianC

関連する問題