如何在网页源码中分离抓取同类型元素?Transfermarkt爬取问题
解决Transfermarkt转入/转出数据区分问题
- 核心思路是通过父容器区分,而非直接全局抓取
zentriert类元素——Transfermarkt页面里,Arrivals(转入)和Departures(转出)各自属于独立的区块,可先定位区块再提取目标元素:- 页面中通常存在
<h2>Arrivals</h2>和<h2>Departures</h2>标签,它们的下一个兄弟元素就是对应的数据表格; - 用BeautifulSoup的
find_next()方法锁定对应表格,再在表格内部提取zentriert类元素,就能精准区分转入/转出数据。
- 页面中通常存在
示例代码:
import requests from bs4 import BeautifulSoup import pandas as pd # 替换为你要爬取的2010赛季英超球队转会页URL url = "https://www.transfermarkt.co.uk/[球队名]/transfers/season/2010" # 模拟浏览器请求头,避免被反爬拦截 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 提取转入数据 arrivals_heading = soup.find("h2", string="Arrivals") arrivals_table = arrivals_heading.find_next("table", class_="items") arrivals_zentriert = [td.get_text(strip=True) for td in arrivals_table.find_all("td", class_="zentriert")] # 提取转出数据 departures_heading = soup.find("h2", string="Departures") departures_table = departures_heading.find_next("table", class_="items") departures_zentriert = [td.get_text(strip=True) for td in departures_table.find_all("td", class_="zentriert")] # 转换为DataFrame按需处理(可根据实际数据结构调整列名和格式) arrivals_df = pd.DataFrame({"转入相关数据": arrivals_zentriert}) departures_df = pd.DataFrame({"转出相关数据": departures_zentriert})
- 补充适配方案:如果页面标题不是精确的"Arrivals",可以用模糊匹配:
soup.find("h2", string=lambda text: "Arrivals" in text.strip());部分页面的转入/转出区块会包裹在class="box"的div里,也可以通过find("div", class_="box", string=lambda x: "Arrivals" in x)定位父容器。
内容的提问来源于stack exchange,提问作者Jarod
相关产品推荐
相关产品推荐

