Python+BeautifulSoup网页表格数据提取问题求助
解决方法:提取Tarkov弹药表格的干净文本数据
看起来你卡在了表格数据拆分和HTML标签清理的环节上,我来帮你搞定这个问题。下面是完整的可运行代码,以及针对你遇到的具体问题的详细解释:
完整实现代码
import requests from bs4 import BeautifulSoup # 目标页面URL url = "https://escapefromtarkov.gamepedia.com/7.62x25mm_Tokarev" # 模拟浏览器请求头,避免被网站反爬拦截 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" } try: # 发送请求获取页面内容 response = requests.get(url, headers=headers) response.raise_for_status() # 如果请求失败,直接抛出异常 # 用BeautifulSoup解析HTML soup = BeautifulSoup(response.text, "html.parser") # 定位到目标弹药表格(页面中class为"wikitable sortable"的表格) target_table = soup.find("table", class_="wikitable sortable") # 存储所有行的干净数据 cleaned_table_data = [] # 遍历表格的每一行,跳过第一行表头 for row in target_table.find_all("tr")[1:]: # 获取当前行的所有单元格 cells = row.find_all("td") # 提取每个单元格的文本,并自动去除前后空格、换行符 row_cleaned = [cell.get_text(strip=True) for cell in cells] # 如果只需要你示例中的前4个字段,直接切片即可 trimmed_row = row_cleaned[:4] cleaned_table_data.append(trimmed_row) # 打印第一行结果,就是你想要的格式 print(cleaned_table_data[0]) except Exception as e: print(f"出现错误:{e}")
针对你遇到的问题的解释
关于
bs4.element.ResultSet无find_all属性的错误
你之前应该是直接对find_all返回的结果调用find_all了——find_all返回的是一个ResultSet对象(本质是列表),它本身没有find_all方法,你需要先从这个列表中取出单个元素,再调用方法。比如正确的做法是:# 错误写法:对ResultSet直接调用find_all # soup.find_all("table").find_all("tr") # 正确写法:先取出第一个表格元素,再找行 soup.find_all("table", class_="wikitable sortable")[0].find_all("tr")不过更简洁的是用
find直接获取单个表格元素,就像我代码里的target_table = soup.find("table", class_="wikitable sortable")。关于返回空列表的问题
大概率是你定位表格的选择器不对。我用浏览器开发者工具查看了目标页面,弹药数据表格的class是wikitable sortable,用这个class定位就能准确找到目标表格。如果选择器错误(比如用了不存在的class或标签),自然会返回空列表。如何提取干净的文本
不要直接用cell.text,而是用cell.get_text(strip=True)——这个方法会自动去除文本前后的空格、换行符和制表符,直接得到干净的内容。
运行上面的代码后,你会得到类似这样的输出:
['7.62x25mm TT AKBS', '58', '12', '32']
内容的提问来源于stack exchange,提问作者Solebay Sharp




