Как разобрать таблицу с внутренней ссылкой по BeautifulSoup? - PullRequest
0 голосов
/ 03 апреля 2020

Часть html выглядит следующим образом:

 <li class="level1">
<span class="index">4</span>
<span class="text"><a href="#4">Reviews</a></span>
</li>
</ol><ol><li class="level1">
<span class="index">5</span>
<span class="text"><a href="#5">Games</a></span>
</li>

Ссылка href = # 5 относится к следующей таблице:

<table log-set-param="table_view" class="ddtable qytable"><tbody>

    <tr><th>Game_name</th><th>date</th><th>team</th><th>score</th><th>opponent</th><th>starting</th><th>play</th><th>scoring</th><th>warning</th><th>details</th><th>-</th></tr>

    <tr>
    <td align="center" valign="middle"><a target="_blank" href="/item/%E8%8B%B1%E8%B6%85">Premier_leagure</a></td>
    <td align="center" valign="middle">11-19 23:00</td><td align="center" valign="middle"><a target="_blank" href="/item/%E6%96%AF%E6%89%98%E5%85%8B%E5%9F%8E">Stoke_city</a></td>
    <td align="center" valign="middle"><b>0 - 1</b></td><td align="center" valign="middle"><a target="_blank" href="/item/%E4%BC%AF%E6%81%A9%E8%8C%85%E6%96%AF">Nournemouth</a></td>
    <td align="center" valign="middle">Yes</td><td align="center" valign="middle">68’</td>
    <td align="center" valign="middle">0</td><td align="center" valign="middle">-</td>
    <td align="center" valign="middle">-</td><td align="center" valign="middle"><a target="_blank" href="/item/%E8%AF%A6%E6%83%85">detail</a></td>
    </tr

Обратите внимание, что ссылки могут быть в ячейка td, то есть "Premier_leature".

Я хочу проанализировать содержимое таблицы в кадре данных или словаре. Как это сделать? Кроме того, как убедиться, что 'href =' # 5 'связана с таблицей, и использовать ссылку href' Игры 'в качестве ключа словаря? Потому что на странице может быть несколько таблиц.

Редактировать: следуйте этому примеру: BeautifulSoup, словарь из HTML таблицы Я получил следующее:

def extract_table():
    rets = []
    tables = soup.find('table')
    for table in tables:
        headers = [header.text for header in table.find_all('th')]
        ret = [{headers[i]: cell for i, cell in enumerate(row.find_all('td'))} for row in table.find_all('tr')]
        rets.append(ret)
        print(ret)

    return rets

«Заголовки» были правильными, но «Рет» был пуст. Из ячейки 'td' ничего не извлечено.

1 Ответ

0 голосов
/ 03 апреля 2020

Вам не нужен этот большой round, вы можете легко использовать функцию pandas.read_html(), чтобы прочитать ее в table согласно вашему запросу. и затем вы можете преобразовать его в dict, используя также pandas.to_dict() функцию:

import pandas as pd

table = """
<table log-set-param="table_view" class="ddtable qytable"><tbody>

    <tr><th>Game_name</th><th>date</th><th>team</th><th>score</th><th>opponent</th><th>starting</th><th>play</th><th>scoring</th><th>warning</th><th>details</th><th>-</th></tr>

    <tr>
    <td align="center" valign="middle"><a target="_blank" href="/item/%E8%8B%B1%E8%B6%85">Premier_leagure</a></td>
    <td align="center" valign="middle">11-19 23:00</td><td align="center" valign="middle"><a target="_blank" href="/item/%E6%96%AF%E6%89%98%E5%85%8B%E5%9F%8E">Stoke_city</a></td>
    <td align="center" valign="middle"><b>0 - 1</b></td><td align="center" valign="middle"><a target="_blank" href="/item/%E4%BC%AF%E6%81%A9%E8%8C%85%E6%96%AF">Nournemouth</a></td>
    <td align="center" valign="middle">Yes</td><td align="center" valign="middle">68’</td>
    <td align="center" valign="middle">0</td><td align="center" valign="middle">-</td>
    <td align="center" valign="middle">-</td><td align="center" valign="middle"><a target="_blank" href="/item/%E8%AF%A6%E6%83%85">detail</a></td>
    </tr
"""
df = pd.read_html(table)[0]
print(df)

df.to_csv("Data.csv", index=False)

Вывод: просмотр онлайн

enter image description here

И преобразовать его в dict:

target = df.to_dict()

print(target)

Вывод:

{'Game_name': {0: 'Premier_leagure'}, 'date': {0: '11-19 23:00'}, 'team': {0: 'Stoke_city'}, 'score': {0: '0 - 1'}, 'opponent': {0: 'Nournemouth'}, 'starting': {0: 'Yes'}, 'play': {0: '68’'}, 'scoring': {0: 0}, 'warning': {0: '-'}, 'details': {0: '-'}, '-': {0: 'detail'}}

Примечание: Относительно вашей точки Also, how to make sure the 'href='#5' linked to the table:

Есть 2 методы:

  1. для использования функции pandas.read_html() вместе с attrs=, как показано ниже:

Здесь мы использовали атрибут table.

<table log-set-param="table_view" class="ddtable qytable"><tbody>

Итак:

df = pd.read_html(table, attrs={'log-set-param': 'table_view', 'class': 'ddtable qytable'})[0]
второй метод, используя ваш прекрасный href="#5, мы будем использовать bs4: P

Поэтому мы сначала найдем его, а затем получим для него следующий table.


element = soup.find("a", href="#5").find_next("table")

df = pd.read_html(str(element))[0]

print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...