美丽的汤| Python | URL循环

时间:2017-08-31 13:12:25

标签: python pandas loops dataframe beautifulsoup

希望这是一个简单的。我查看了与查询相关的大多数有效帖子(并从每个帖子中获取了片段)以应用于我自己的代码,但出于某种原因,我没有太多运气。

基本上,我想要实现的目标如下:

  • 循环浏览realestate.com上的前3页 - 售价
  • 获取地址和售价
  • 将值放入Pandas 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:列表索引超出范围

我错过了一些明显的东西吗?

非常感谢任何帮助。

亲切的问候, 阿德里安

1 个答案:

答案 0 :(得分:1)

range(3)不从1开始。它从0开始。如果您希望从1开始,map范围将每个数字递增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))