Очистите несколько таблиц и поместите несколько строк в заголовки столбцов. - PullRequest
1 голос
/ 30 сентября 2019

Я собрал сайт, управляемый javascript, и сохранил таблицы с нескольких страниц в одном HTML-документе (пример https://drive.google.com/open?id=1AMt6vj6iCrfiJkeriMpDlAObRUVQ4kem здесь). В таблицах нет столбцов заголовков, но у каждой строки есть заголовок, а затем точка данных - эти заголовки строк повторяются во всех таблицах.

Вот PastBin: https://pastebin.com/QSdFU0Ah

Я могу очистить всестроки, но не знаю, как сделать каждый заголовок строки в заголовок столбца с данными строки в качестве своих данных.

enter image description here

Я хочу выглядеть как CVS:

enter image description here

    with open('tst.html', "r") as all_content:
    soup = BeautifulSoup(all_content, "html.parser")

    titles= soup.find_all('title')

    for title in titles:
    rows = soup.select_one("table").find_all('tr')
        for row in rows:
            print(row)

1 Ответ

0 голосов
/ 30 сентября 2019

Вы можете использовать nth-of-type (я использую с bs4 4.7.1+), чтобы получить первый столбец как заголовки, а второй столбец как значения под этими заголовками.

import pandas as pd
from bs4 import BeautifulSoup as bs

with open('filepath/sample.html','r') as f:
    soup = bs(f.read(), 'html.parser')

headers = [td.text for td in soup.select_one('table').select('td:nth-of-type(1)')]
results = []

for table in soup.select('table'):
    row = [td.text for td in table.select('td:nth-of-type(2)')]
    results.append(row)

df = pd.DataFrame(results, columns = headers)
print(df)

Вы также можете использовать CSV

import csv
from bs4 import BeautifulSoup as bs

with open('filepath/sample.html','r') as f:
    soup = bs(f.read(), 'html.parser')

headers = [td.text for td in soup.select_one('table').select('td:nth-of-type(1)')]

with open("data.csv", "w", encoding="utf-8-sig", newline='') as csv_file:
    w = csv.writer(csv_file, delimiter = ",", quoting=csv.QUOTE_MINIMAL)
    w.writerow(headers)
    for table in soup.select('table'):
        w.writerow([td.text for td in table.select('td:nth-of-type(2)')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...