2017-08-31 13 views
1

これは簡単なことです。私は自分のクエリに関連する有効な投稿の大部分を見ていて、それぞれのコードに適用するようにしましたが、何らかの理由で大したことはありません。美しいスープ| Python | URLルーピング

基本的に、私は何を達成しようとしていることは以下の通りです:

  • ループはrealestate.com上の最初3ページを - 販売価格
  • アドレスと販売価格
  • 入れ値を取得します。

私が以下を(URLループなしで)チャンクで実行すると、1ページ目で動作します。最初の3ページを通過して20個のリストをすべて返す必要があります (1ページあたり)。

empty_list = [] 

for page_number in range(3): 
    url_test = "https://www.realestate.com.au/sold/list-{}?activeSort=solddate".format(page_number) 
    r = requests.get(url_test) 
    soup = BeautifulSoup(r.text, "html.parser") 
    results_price = soup.find_all('span', attrs={'class':'property-price'}) 
    results_info = soup.find_all('div', attrs={'class':'property-card__info'}) 
    raw_html1 = results_price[page_number] 
    clean_price = raw_html1.text 
    raw_html2 = results_info[page_number] 
    street = raw_html2.find('a').text 
    empty_list.append((street, clean_price)) 

df = pd.DataFrame(empty_list, columns=["Address", "Sold_Price"]) 

ERROR:はIndexError:範囲外のリストインデックス

私は紛れも何かを明らかに逃したことがありますか?

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

種類よろしく、 エイドリアン

+0

を 'results_price'と' results_info'は、実際には3つのエントリかどうかを持っていますか?それをチェックしてください。 – campovski

+0

こんにちは!両方の変数は20項目(過去20項目の売却)を返します。これに合わせて範囲を(3)から(20)に変更しましたが、それでも同じエラーが返されます。私は何が欠けているかに関する任意のアイデア?あなたはこれを実行できます - BeautifulSoup、Requests、Pandasを使ってPython 3.5を使って – AdrianC

+0

'range(3)'を '[0,1,2]'に変換します。有効なウェブページに0の結果を代入してもよろしいですか? – Mangohero1

答えて

1

range(3)は1で各番号をインクリメントするmap、あなたはそれが1で開始したい場合は、0から始まる1から範囲を開始しません。

for page_number in list(map(lambda x: x+1, range(3))): 
    ... 

rangeの使用方法に関するドキュメントを参照してください。

が内部で追加forループを追加します。

for p in range(20): 
     raw_html1 = results_price[p] 
     clean_price = raw_html1.text 
     raw_html2 = results_info[p] 
     street = raw_html2.find('a').text 
     empty_list.append((street, clean_price)) 

だから、全体のコードは次のようになります。

for page_number in list(map(lambda x: x+1, range(3))): 
    url_test = "https://www.realestate.com.au/sold/list-{}? 
    activeSort=solddate".format(page_number) 
    r = requests.get(url_test) 
    soup = BeautifulSoup(r.text, "html.parser") 
    results_price = soup.find_all('span', attrs={'class':'property-price'}) 
    results_info = soup.find_all('div', attrs={'class':'property-card__info'}) 
    for p in range(20): 
      raw_html1 = results_price[p] 
      clean_price = raw_html1.text 
      raw_html2 = results_info[p] 
      street = raw_html2.find('a').text 
      empty_list.append((street, clean_price)) 
+0

上記と同様に、ページ1,2および3から単一の値を返します。理想的には、1ページあたり20個の完全なリストが必要です - ランダムなものではない – AdrianC

+0

ああ、わかりました。 'page_number'は最初のページからの最初の結果、2番目のページからの2番目の結果、3番目のページからの3番目の結果を取得することを意味します。反復をチェックしてください。私はその間に私の答えを更新します – Mangohero1

+0

@AdrianC、私の答えは更新されました – Mangohero1

関連する問題