如何提取网页表格内链接的指定数据并追加到已有CSV文件中
实现方案
核心问题是你之前提取链接的逻辑顺序错误,应该先定位目标表格行,再从指定国家列提取链接,不需要全局搜索所有链接,修正后可直接实现需求:
import requests import re import time import pandas as pd from bs4 import BeautifulSoup # 维基基础域名,英文站请替换为https://en.wikipedia.org WIKI_BASE = 'https://zh.wikipedia.org' # 这里保留你原有的df初始化、country_names定位逻辑 rows = country_names.find_all('tr') columns = [re.sub('(\[[a-zA-Z\d]*\])+\n','',v.text).strip() for v in rows[0].find_all('th')] # 追加你需要从国家详情页提取的字段名,可按需修改 columns.extend(['首都', '人口']) print(columns) for i in range(1, len(rows)): tds = rows[i].find_all('td') if len(tds) == 4: # 修复原有代码笔误:td[2]改为tds[2] values = [tds[0].text, tds[1].text, '', tds[2].text, tds[3].text] else: values = [re.sub('\xa0sq\xa0mi','',td.text).replace('\n','').replace('\xa0km2','').replace('\u200e','') for td in tds] # 提取国家列的链接,这里假设国家是第一列,索引为0,可根据你的表格结构调整 country_a_tag = tds[0].find('a', href=True) if country_a_tag: # 拼接完整可访问的国家页面链接 country_full_url = WIKI_BASE + country_a_tag['href'] # 发起请求,User-Agent替换为你自己浏览器的UA,避免被反爬拦截 resp = requests.get(country_full_url, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }) country_soup = BeautifulSoup(resp.text, 'html.parser') # 以下是提取指定数据的示例,可按需替换为你需要的字段逻辑 # 提取首都 capital = '' capital_th = country_soup.find('th', string=re.compile('首都')) if capital_th and capital_th.find_next_sibling('td'): capital = capital_th.find_next_sibling('td').text.strip() # 提取人口 population = '' population_th = country_soup.find('th', string=re.compile('人口')) if population_th and population_th.find_next_sibling('td'): population = population_th.find_next_sibling('td').text.strip() # 把新提取的字段追加到原有行数据中 values.extend([capital, population]) # 加延迟避免被封 time.sleep(1) else: # 无链接的国家补空值 values.extend(['', '']) # 追加到DataFrame df = df.append(pd.Series(values, index=columns), ignore_index=True) # 直接导出到CSV,新字段会自动追加 df.to_csv('你原有数据的文件.csv', index=False, encoding='utf-8-sig')
注意事项
- 请求头中必须携带
User-Agent参数,否则会触发维基的反爬机制返回403,你可以打开浏览器开发者工具的网络标签,随便复制一个请求的UA填入即可 - 爬取频率不要过高,建议每次请求后加
time.sleep(1)的延迟,避免被限制访问 - 不同维基页面的信息栏结构有差异,需要你根据实际要提取的内容调整对应的BeautifulSoup定位逻辑
内容的提问来源于stack exchange,提问作者zamnas
相关产品推荐
相关产品推荐

