bs4中文叫做美丽汤第4版,是用Python写的一个HTML/XML的解析器。中文文档链接:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
requests中文叫做请求,是用来发起http请求和接收http相应的库。官方文档链接:
http://docs.python-requests.org/zh_CN/latest/api.html
在详情页面,部分页面具有5个字段信息,部分页面具有2个字段信息。
每个字段信息都在li标签中,对每个li标签做循环遍历。
将li标签中的第1个class等于dt的div标签作为字典的键,将li标签中的第1个class等于dd的div标签作为字典的值。
将数据收集结果item_list数据持久化为excel时,对变量item_list进行循环遍历,excel表格的字段名要赋值为最多键值对的字典的所有键。
from bs4 import BeautifulSoup as bs
import requests
response = requests.get('http://www.worldrowing.com/events/2018-world-rowing-under-23-championships/u23-mens-eight/')
soup = bs(response.text, 'html.parser')
athlete_list = soup.select('tr.resultsDetails li')
item_list = []
for athlete in athlete_list:
item = {}
item['name'] = athlete.select('h4 a')[0].text
item['position'] = athlete.select('p.yPadding')[0].text.strip()
item['img_url'] = 'http://www.worldrowing.com' + athlete.select('img')[0]['src']
detail_url = 'http://www.worldrowing.com' + athlete.select('h4 a')[0]['href']
response = requests.get(detail_url)
soup = bs(response.text, 'html.parser')
li_list = soup.select('div.athleteInfoBody li')
for li in li_list:
key = li.select('div.dt')[0].text
value = li.select('div.dd')[0].text
item[key] = value
item_list.append(item)
longest_keys = item_list[0].keys()
for item in item_list:
if len(item.keys()) > len(longest_keys):
longest_keys = item.keys()
import pandas as pd
df = pd.DataFrame(item_list, columns=longest_keys)
df.to_excel('athleteRecord3.xlsx')