希望这是一个简单的。我查看了与查询相关的大多数有效帖子(并从每个帖子中获取了片段)以应用于我自己的代码,但出于某种原因,我没有太多运气。
基本上,我想要实现的目标如下:
如果我在块中执行以下(没有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 :(得分: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))