如何抓取GitHub中.md文件的职位列表并导出为CSV?
解决方案
1. 定位目标UL元素
GitHub上的目标职位列表位于标题Companies that don't do whiteboard interviews下方的<ul>中,我们可以通过先定位该标题,再获取其后续的<ul>来精准定位目标列表:
import requests from bs4 import BeautifulSoup import pandas as pd # 获取页面内容 url = 'https://github.com/poteto/hiring-without-whiteboards/blob/master/README.md' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 定位目标标题及对应的UL target_heading = soup.find('h2', string="Companies that don't do whiteboard interviews") target_ul = target_heading.find_next('ul')
2. 提取A标签、位置与描述文本
每个<li>的结构为<a>公司名</a> | 位置 | 描述,我们可以通过以下步骤拆分内容:
- 提取
<a>标签的文本(公司名)和链接 - 移除
<li>中<a>标签的文本,剩余内容按|分割,分别提取位置和描述(处理部分条目无描述的情况)
data_list = [] for li in target_ul.find_all('li'): # 提取A标签信息 a_tag = li.find('a') if not a_tag: continue # 跳过无A标签的条目 a_text = a_tag.get_text(strip=True) a_href = a_tag['href'] # 拆分位置与描述 # 移除A标签文本后处理剩余内容 remaining_text = li.get_text(strip=True).replace(a_text, '', 1).strip() parts = [p.strip() for p in remaining_text.split('|') if p.strip()] location = parts[0] if len(parts) >= 1 else '' description = ' | '.join(parts[1:]) if len(parts) >= 2 else '' # 存入数据列表 data_list.append({ 'A标签文本': a_text, 'A标签链接': a_href, '位置': location, '描述': description })
3. 用Pandas导出CSV
Pandas可以快速将结构化数据导出为CSV,只需将数据列表转为DataFrame,指定列后导出即可:
# 转为DataFrame df = pd.DataFrame(data_list) # 按需求调整列顺序(此处以A标签文本为例,若需链接可替换为'A标签链接') output_df = df[['A标签文本', '位置', '描述']] # 导出CSV output_df.to_csv('github职位列表.csv', index=False, encoding='utf-8-sig')
关键说明
- 定位目标UL时,利用标题与列表的紧邻关系,避免误抓其他无关
<ul> - 拆分文本时通过
replace移除A标签文本,再按|分割,同时处理空值情况,保证数据完整性 - Pandas简化了CSV导出流程,自动处理编码、列对齐等问题,比手动写入CSV更高效可靠
内容的提问来源于stack exchange,提问作者robothead
相关产品推荐
相关产品推荐

