我正在尝试使用beautifulsoup概念抓取多个页面,但我只得到最后一页结果作为输出,请建议正确的方法。以下是我的代码。
# For every page
for page in range(0,8):
# Make a get request
response = get('http://nationalacademyhr.org/fellowsdirectory?page=0%2C{}' + format(page))
# Pause the loop
sleep(randint(8,15))
# Monitor the requests
requests += 1
elapsed_time = time() - start_time
print('Request:{}; Frequency: {} requests/s'.format(requests, requests/elapsed_time))
clear_output(wait = True)
html_soup = BeautifulSoup(response.text, 'html.parser')
all_table_info = html_soup.find('table', class_ = "views-table cols-4")
for name in all_table_info.find_all('div',
class_="views-field views-field-view"):
names.append(name.text.replace("\n", " ")if name.text else None)
for organization in all_table_info.find_all('td',
class_="views-field views-field-field-employer"):
orgs.append(organization.text.strip() if organization.text else None)
for year in all_table_info.find_all('td',
class_ = "views-field views-field-view-2"):
Years.append(year.text.strip() if year.text else None)
df = pd.DataFrame({'Name' : names, 'Org' : orgs, 'year' : Years })
print (df)
答案 0 :(得分:2)
输入错误:加号而不是点。你需要'http://nati...ge=0%2C{}'.format(page)
,
但你写道
'http://nati...ge=0%2C{}' + format(page)
在页码之前具有大括号的网址最终位于同一页面。
编辑:
如果我不清楚,你需要改变这条线
response = get('http://nationalacademyhr.org/fellowsdirectory?page=0%2C{}' + format(page))
至
response = get('http://nationalacademyhr.org/fellowsdirectory?page=0%2C{}'.format(page))
在第一种情况下,结果网址还包含子字符串' {}',这会导致问题。
答案 1 :(得分:0)
注意:网站上有9个页面由page=0,0
标识到page=0,8
。你的循环应该使用range(9)
。或者,更好的是,加载第一页,然后使用next
链接获取下一页的网址。按照next
链接迭代所有页面,直到页面上没有next
链接。
除了标识问题的xhancar's answer之外,更好的方法是在构建URL时避免字符串操作,而是让requests
为您构建URL查询字符串:
for page in range(9):
params = {'page': '0,{}'.format(page)}
response = get('http://nationalacademyhr.org/fellowsdirectory', params=params)
params
参数传递给requests.get()
,后者将值添加到URL查询字符串中。查询参数将被正确编码,例如, ,
已替换为%2C
。