You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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}")

针对你遇到的问题的解释

  1. 关于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")

  2. 关于返回空列表的问题
    大概率是你定位表格的选择器不对。我用浏览器开发者工具查看了目标页面,弹药数据表格的class是wikitable sortable,用这个class定位就能准确找到目标表格。如果选择器错误(比如用了不存在的class或标签),自然会返回空列表。

  3. 如何提取干净的文本
    不要直接用cell.text,而是用cell.get_text(strip=True)——这个方法会自动去除文本前后的空格、换行符和制表符,直接得到干净的内容。

运行上面的代码后,你会得到类似这样的输出:

['7.62x25mm TT AKBS', '58', '12', '32']

内容的提问来源于stack exchange,提问作者Solebay Sharp

火山引擎 最新活动