如何仅抓取span标签对应的任期(Term of Office)日期数据?
问题与解决方案
问题
我尝试抓取任期(Term of Office)数据并将年份显示在DataFrame中,但无法成功抓取目标数据。我使用以下代码进行尝试,却只能获取‘Term of Office’文本而非任期年份:
r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') president_name = soup.find_all('div', class_='presidentListing') term_of_office = soup.find_all('span', class_='terms') president_name = soup.find_all('div', class_='presidentListing') term_of_office = soup.find_all('span', class_='terms') names = [] terms = [] for i in president_name: name = i.text.split('(')[0].strip() if name != '': names.append(name) for i in term_of_office: term = i.text terms.append(term) terms
解决方案
问题出在你选择的span.terms元素本身的文本就是“Term of Office”,实际的任期年份应该在该元素的同级文本节点或者父元素的其他区域里。以下是两种常见场景的修正代码:
场景1:年份在span标签的后续文本中
如果页面结构是Term of Office: 19XX-XXXX这种形式,年份在span后面的文本里,修改遍历逻辑:
r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') president_name = soup.find_all('div', class_='presidentListing') term_of_office = soup.find_all('span', class_='terms') names = [] terms = [] for i in president_name: name = i.text.split('(')[0].strip() if name != '': names.append(name) for i in term_of_office: # 获取span标签后的相邻文本,清理多余空格 term = i.next_sibling.strip() terms.append(term) # 生成DataFrame import pandas as pd df = pd.DataFrame({'姓名': names, '任期': terms}) print(df)
场景2:年份和标签在同一个父元素内
如果年份和Term of Office标签在同一个父容器里,可通过父元素提取文本后过滤掉标签文本:
for i in term_of_office: # 提取父元素的全部文本,移除标签文本后清理空格 full_text = i.parent.text term = full_text.replace('Term of Office', '').strip() terms.append(term)
注意事项
- 若还是无法获取,建议用
soup.prettify()打印页面结构,确认年份所在的具体标签位置; - 确保
names和terms的长度一致,避免DataFrame生成时出现错误。
内容的提问来源于stack exchange,提问作者HermioneCodes
相关产品推荐
相关产品推荐

