如何用Python批量爬取URL列表中维基百科页面infobox的指定数据
现有代码存在的问题
- 缺少页面请求逻辑:遍历URL列表时没有针对每个URL发起HTTP请求获取页面内容,直接使用未定义的
text变量构造BeautifulSoup对象,无法获取对应页面的DOM结构 - 对infobox的DOM结构理解错误:
infobox-label类的td标签和infobox-data类的td标签是同级兄弟节点,同属于一个tr标签的子元素,在label节点下查找data节点永远返回空 - 判断逻辑错误:判断条件写反了,应该校验
infobox-label的文本内容是否为目标字段(比如Date),而不是判断查找data节点的结果等于"date" - 取值方法错误:
item.get()是用来获取HTML标签的属性值,infobox-data是类名不是属性,无法用该方法获取目标内容
调整后的实现方案
你可以先定位整个infobox容器,再逐行匹配目标字段提取内容,容错性更高,参考实现代码如下:
import requests from bs4 import BeautifulSoup list_of_urls = [] # 替换为你自己的URL列表 # 存储最终结果的列表 result = [] for url in list_of_urls: # 发起请求获取页面内容,加超时避免卡住 resp = requests.get(url, timeout=10) resp.encoding = "utf-8" soup = BeautifulSoup(resp.text, features="lxml") # 先定位整个infobox盒子,避免全局找label误匹配 infobox = soup.find("table", class_="infobox") if not infobox: # 没有infobox的页面可跳过或者做特殊处理 continue page_data = {} # 遍历infobox里的每一行 for tr in infobox.find_all("tr"): label_td = tr.find("td", class_="infobox-label") data_td = tr.find("td", class_="infobox-data") # 同时存在label和data的行才处理 if not label_td or not data_td: continue # 提取label文本,去除多余空白 label_text = label_td.get_text(strip=True) # 匹配目标字段,可根据需要新增其他字段 if label_text == "Date": page_data["date"] = data_td.get_text(strip=True) elif label_text == "Coordinates": # 坐标可以单独处理提取经纬度,也可以直接存文本 page_data["coordinates"] = data_td.get_text(strip=True) # 其他需要提取的字段可以继续加elif result.append(page_data) print(page_data)
如果需要提取更多字段,只需要在判断分支里新增对应label的匹配规则即可;如果需要结构化的经纬度数据,可以进一步解析infobox-data下的geo标签内容。
内容的提问来源于stack exchange,提问作者Scapegoat
相关产品推荐
相关产品推荐

