网页表格爬取问题:无法获取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
相关产品推荐
相关产品推荐

