You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取网页表格内链接的指定数据并追加到已有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:45:04