首页 > 解决方案 > 使用 bs4 和 Python 进行网页抓取

问题描述

我尝试使用的 HTML 文本有问题。

我想提取球员的姓名以及与他相关的所有统计数据。

基本上,由于代码的语法,我不确定是否可以提取列的数字。

在 HTML 中,我只包括了 2 名球员,但我想添加这个俱乐部的所有球员,然后继续下一支球队。

<table data-toggle="table-estadisticas-clubes" data-fixed-columns="true" data-fixed-number="2" class="roboto">
    <thead>
        <tr class="cabecera_general">
            <th>&nbsp;</th>
            <th>&nbsp;</th>
            <th>PAR</th>
            <th>MIN</th>
            <th>&nbsp;</th>
            <th>PT</th>
            <th colspan="3">TIROS DE 3</th>
            <th colspan="3">TIROS DE 2</th>
            <th colspan="3">TIROS LIBRES</th>
            <th colspan="3">REBOTES</th>
            <th>ASI</th>
            <th colspan="2">BALONES</th>
            <th colspan="2">TAPONES</th>
            <th>&nbsp;</th>
            <th colspan="2">FALTAS</th>
            <th>&nbsp;</th>
            <th class="ultimo">VAL</th>
        </tr>
        <tr>
            <th class="situacion">&nbsp;</th>
            <th class="nombre jugador">&nbsp;</th>
            <th>Jug</th>
            <th>Jug</th>
            <th>5i</th>
            <th>&nbsp;</th>
            <th>Con</th>
            <th>Int</th>
            <th>%</th>
            <th>Con</th>
            <th>Int</th>
            <th>%</th>
            <th>Con</th>
            <th>Int</th>
            <th>%</th>
            <th>Def</th>
            <th>Ofe</th>
            <th>Tot</th>
            <th>Efe</th>
            <th>Rec</th>
            <th>Per</th>
            <th>Fav</th>
            <th>Con</th>
            <th>Mat</th>
            <th>Com</th>
            <th>Rec</th>
            <th>+/-</th>
            <th class="ultimo">&nbsp;</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td class="situacion"></td>
            <td class="nombre jugador ellipsis"><a href="/jugador/ver/30000024-William-Magarity"><span class="nombre_corto">William Magarity</span></a></td>
            <td class="borde_derecho">2</td>
            <td class="borde_derecho">23:57</td>
            <td class="borde_derecho"></td>
            <td class="borde_derecho">11,5</td>
            <td class="borde_derecho">3,0</td>
            <td class="borde_derecho">4,0</td>
            <td class="borde_derecho">75,0%</td>
            <td class="borde_derecho">0,5</td>
            <td class="borde_derecho">2,5</td>
            <td class="borde_derecho">20,0%</td>
            <td class="borde_derecho">1,5</td>
            <td class="borde_derecho">1,5</td>
            <td class="borde_derecho">100,0%</td>
            <td class="borde_derecho">3,5</td>
            <td class="borde_derecho">0,0</td>
            <td class="borde_derecho">3,5</td>
            <td class="borde_derecho">1,5</td>
            <td class="borde_derecho">1,5</td>
            <td class="borde_derecho">1,0</td>
            <td class="borde_derecho">0,5</td>
            <td class="borde_derecho">0,0</td>
            <td class="borde_derecho">0,5</td>
            <td class="borde_derecho">0,5</td>
            <td class="borde_derecho">2,0</td>
            <td class="borde_derecho">1,0</td>
            <td class="borde_derecho">16,0</td>
        </tr>
        <tr class="par">
            <td class="situacion"></td>
            <td class="nombre jugador ellipsis"><a href="/jugador/ver/30000283-Jaime-Echenique"><span class="nombre_corto">Jaime Echenique</span></a></td>
            <td class="borde_derecho">2</td>
            <td class="borde_derecho">23:34</td>
            <td class="borde_derecho"></td>
            <td class="borde_derecho">14,0</td>
            <td class="borde_derecho">0,5</td>
            <td class="borde_derecho">1,0</td>
            <td class="borde_derecho">50,0%</td>
            <td class="borde_derecho">3,5</td>
            <td class="borde_derecho">7,0</td>
            <td class="borde_derecho">50,0%</td>
            <td class="borde_derecho">5,5</td>
            <td class="borde_derecho">6,0</td>
            <td class="borde_derecho">91,7%</td>
            <td class="borde_derecho">0,0</td>
            <td class="borde_derecho">3,5</td>
            <td class="borde_derecho">3,5</td>
            <td class="borde_derecho">1,0</td>
            <td class="borde_derecho">0,5</td>
            <td class="borde_derecho">2,0</td>
            <td class="borde_derecho">2,0</td>
            <td class="borde_derecho">0,0</td>
            <td class="borde_derecho">0,5</td>
            <td class="borde_derecho">3,0</td>
            <td class="borde_derecho">4,0</td>
            <td class="borde_derecho">-1,5</td>
            <td class="borde_derecho">15,5</td>
        </tr>
    </tbody>
</table>

网址:https ://www.acb.com/club/estadisticas/id/14

标签: pythonweb-scrapingbeautifulsoup

解决方案


解析表的最简单方法是使用pandas

import pandas as pd


url = 'https://www.acb.com/club/estadisticas/id/14'
df = pd.read_html(url)[0].iloc[:,1:]
df.to_csv('data.csv', index=False)

将表格抓取到数据框并将其保存为data.csv

在此处输入图像描述


推荐阅读