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

网页表格爬取问题:无法获取td标签内的宗教、族群等数据

问题分析与解决办法

核心问题原因

  • 反爬拦截:该网站会校验请求的User-Agent字段,你的代码直接用requests.get()发送请求,没有模拟浏览器标识,被网站判定为爬虫,返回的页面是不完整的空数据或反爬页面,自然无法提取到目标td标签内容。
  • 解析器适配问题:内置的html.parser对复杂HTML结构的解析兼容性较差,可能导致部分标签解析丢失。
  • 数据存储逻辑错误:你注释的循环代码中,towns.append(table_data[i])的用法完全错误——pandas.DataFrame.append()需要传入Series或DataFrame对象,且不能用索引直接取标签列表元素。

修正后的代码

import pandas as pd
from bs4 import BeautifulSoup
import requests

# 初始化用于存储数据的DataFrame
towns = pd.DataFrame(columns=["分类", "数据"])

url = "https://www.city-data.com/city/Adak-Alaska.html"
# 添加请求头模拟浏览器访问,避免被反爬拦截
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"
}

# 发送带请求头的请求
response = requests.get(url, headers=headers)
# 自动识别页面编码,避免乱码
response.encoding = response.apparent_encoding
# 使用lxml解析器(需提前pip install lxml),解析复杂页面更稳定
doc = BeautifulSoup(response.text, "lxml")

# 定位目标表格(通过class筛选,只抓取带table-striped类的表格,对应宗教、族群等数据)
target_tables = doc.find_all("table", class_="table-striped")

for table in target_tables:
    rows = table.find_all("tr")
    for row in rows:
        cols = row.find_all("td")
        # 确保每行至少有两个td标签(分类+数据)
        if len(cols) >= 2:
            category = cols[0].get_text(strip=True)
            data = cols[1].get_text(strip=True)
            # 向DataFrame添加行数据
            towns.loc[len(towns)] = [category, data]

# 打印结果
print(towns)

关键注意事项

  • 必须添加User-Agent请求头,这是绕过基础反爬的核心步骤,也可以定期更换不同的浏览器标识。
  • 优先使用lxml或html5lib解析器,内置的html.parser在处理嵌套复杂的HTML时容易出问题。
  • 不要直接抓取所有td标签,先通过表格的class、id等属性定位到目标表格,再提取其中的行和列,这样能过滤大量无关数据,提升效率。
  • pandas 2.0及以上版本已弃用append()方法,推荐使用loc或concat来添加行数据。

内容的提问来源于stack exchange,提问作者Virtual Adept

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:36:21