Очистка таблиц со скрытыми строками с веб-страницы - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь очистить эту таблицу (https://rk.americaeconomia.com/display/embed/multilatinas/2019). Как видите, в таблице есть два типа строк: «dataRow» и «extraDataRow», и оба типа строк относятся к одной и той же фирме / компании.

Я пробовал приведенный ниже код, но я Не могу создать Словарь с необходимой информацией. Любая помощь приветствуется за выполнение двух задач: (1) очистить всю таблицу обоими типами строк и (2) создать фрейм данных для хранения «всех» данных, относящихся к каждой фирме.

Спасибо заранее.

def getHTMLContent(link):
html = urlopen(link)
soup = BeautifulSoup(html, 'html.parser')
return soup

content = getHTMLContent('https://rk.americaeconomia.com/display/embed/multilatinas/2019')
tables = content.find_all('table')
table = content.find('table', {'class': 'table'})
for tr in table.find_all('tr'):
if(tr.get('class')==['dataRow']):
    print(cell.text)
elif ((tr.get('class') == ['extraDataRow'])):
    print(cell.text)

Мой результат должен выглядеть так

Firm   Country    Sector   %Multi  Ranking18   Total sales 2018  ...



Cols 1-4 are in "dataRow". Cols 5, 6 .......  are in "extraDataRow". 

В «extraDataRow» у меня 32 столбца с дополнительной информацией по каждой фирме, и мне нужна информация обо всех эти 32 столбца объединены с информацией первых четырех столбцов («dataRow»). Мне нужна вся информация в виде таблицы.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Вот быстрое решение, которое я придумал.

Я создал функцию для получения всех заголовков из первой найденной строки extraDetails и первой найденной нормальной строки. Затем получаются все нормальные ряды. I l oop просматривает все строки и использует атрибут data-target, чтобы получить строку дополнительных сведений. Используя эти данные, я создаю объект, используя заголовки в качестве ссылки, которая форматирует данные требуемым способом.

from urllib.request import urlopen

from bs4 import BeautifulSoup

def get_headers(soup):
    header_names = []
    headers = soup.find('thead').find_all('th')

    for h in headers:
        header_names.append(h.text)

    extra_headers = soup.find(attrs={
            'class': 'extraDataRow'
        }).find_all(attrs={
            'class': 'extraMiniHeader'
        })

    for h in extra_headers:
        header_names.append(h.text)

    return header_names

html = urlopen('https://rk.americaeconomia.com/display/embed/multilatinas/2019')
soup = BeautifulSoup(html, 'html.parser')

headers = get_headers(soup)
rows = soup.find_all(attrs={'class': 'dataRow'})
results = []
for r in rows:
    result = {}
    data = r.find_all('td')
    data_count = len(data)
    for i in range(0, data_count):
        result[headers[i]] = data[i].text
    extra = soup.find(attrs={
        'data-link': r.attrs.get('data-target'), 
        'class': 'extraDataRow'
    })
    extra_data = extra.find_all(attrs={
            'class': 'extraMiniValue'
        })

    extra_count = len(extra_data)

    for i in range(data_count, data_count + extra_count):
        result[headers[i]] = extra_data[i - data_count].text

    results.append(result)

# Prints First Result
print(results[0])
0 голосов
/ 26 мая 2020

В этом случае вам не нужно беспокоиться обо всем этом - просто используйте pandas:

import pandas as pd
table = pd.read_html('your url')
tables[0]

Результат - ваша целевая таблица.

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