2017-08-31 66 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