2017-08-31 64 views
1

希望這是一個容易的。我已經瀏覽了大部分與我的查詢相關的有效帖子(並從每個代碼片段中獲取了代碼片段),以便將其應用到我自己的代碼中,但出於某種原因,我沒有太多運氣。美麗的湯| Python | URL循環

從本質上講,我想要實現的是以下幾點:

  • 遍歷上realestate.com第3頁 - 出售價格
  • 獲取地址與出售價格
  • 認沽值到熊貓DataFrame

如果我執行下面的塊(沒有URL循環),它適用於頁1。我需要的是它通過前三頁,並返回所有20列表 (每頁)。

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"]) 

錯誤:IndexError:列表索引超出範圍

我錯過了什麼昭然若揭?

任何幫助將不勝感激。

親切的問候, 阿德里安

+0

做'results_price'和'results_info'實際上有3項或不?檢查出。 – campovski

+0

你好!這兩個變量都會返回20個條目(最後20個物業出售)。我已經改變了從(3)到(20)的範圍來匹配這個,但它仍然返回相同的錯誤。任何想法,我失蹤了什麼?你可以運行這個 - 使用Python 3.5使用BeautifulSoup,Requests和Pandas – AdrianC

+0

'range(3)'轉換爲'[0,1,2]'。你確定在有效的網頁中代入0結果嗎? – Mangohero1

回答

1

range(3)沒有開始在1.從0開始。如果你希望它在一個開始,map範圍由一個遞增每個號碼。

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頁返回一個單獨的值。理想情況下,我希望每頁都顯示全部20個列表 - 不是隨機的 – AdrianC

+0

啊我明白了。 'page_number'只意味着你得到了第一頁的第一個結果,第二頁的第二個結果和第三頁的第三個結果。檢查你的迭代。我將在此期間更新我的答案 – Mangohero1

+0

@AdrianC,我的答案已更新 – Mangohero1