Как получить данные из живой таблицы с помощью веб-скребка? - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь настроить живую таблицу, загружая данные непосредственно с веб-сайта через Python. Я предполагаю, что я следую за всеми шагами к точке, но я все еще не могу получить данные из упомянутой таблицы.

Я обращался ко многим веб-страницам и блогам, чтобы попытаться исправить проблему, но безуспешно. Мне нужна помощь сообщества переполнения стека.

Ниже приведен веб-сайт таблицы, и на странице есть только одна таблица, с которой я пытаюсь получить данные:

https://etfdb.com/themes/smart-beta-etfs/#complete-list__esg&sort_name=assets_under_management&sort_order=desc&page=1

Данные в таблице частично доступны бесплатно, а остальное оплачивается. Так что я думаю, что здесь проблема, но я бы предположил, что смогу загрузить бесплатные данные. Но так как я впервые пробую это и, учитывая, что я новичок в Python, я могу ошибаться. Поэтому, пожалуйста, вся помощь приветствуется.

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

import pandas as pd

import html5lib

import lxml

from bs4 import BeautifulSoup

import requests


site = 'https://etfdb.com/themes/smart-beta-etfs/#complete-list&sort_name=assets_under_management&sort_order=desc&page=1'

page1 = requests.get(site, proxies = proxy_support)

page1

page1.status_code

page1.text

from bs4 import BeautifulSoup

soup = BeautifulSoup(page1.text, 'html.parser')

print(soup)

print(soup.prettify())

table = soup.find_all("div", class_ = "fixed-table-body")

table

Когда я запускаю команду таблицы, она не дает мне никаких данных, и поле полностью пусто, хотя на сайте есть таблица. Вся помощь будет очень признательна.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Я хотел бы использовать pandas фрейм данных для извлечения таблицы и может экспортировать в CSV.

import pandas as pd

tables=pd.read_html("https://etfdb.com/themes/smart-beta-etfs/#complete-list&sort_name=assets_under_management&sort_order=desc&page=1")
table=tables[0][:-1]
print(table)
table.to_csv('table.csv') #You can find the csv file in project folder after run
0 голосов
/ 15 мая 2019

Страница выполняет другой запрос этой информации, который возвращает json, который вы можете проанализировать

import requests

r = requests.get('https://etfdb.com/data_set/?tm=77630&cond=&no_null_sort=&count_by_id=&sort=assets_under_management&order=desc&limit=25&offset=0').json()

Некоторые ключи (те, что для выходных столбцов Symbol и ETF Name - ключи symbol и name)связаны с HTML, так что вы можете использовать bs4 для обработки этих значений и извлечь конечный желаемый результат;остальные пары значений ключей просты.

Например, если вы зацикливаете каждую строку в json

for row in r['rows']:
    print(row)
    break

Вы получаете строки для синтаксического анализа, из которых два элемента нуждаются в bs4, например это .


Python:

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

r = requests.get('https://etfdb.com/data_set/?tm=77630&cond=&no_null_sort=&count_by_id=&sort=assets_under_management&order=desc&limit=25&offset=0').json()
results = []

for row in r['rows']:
    soup = bs(row['symbol'], 'lxml')
    symbol = soup.select_one('.caps').text
    soup = bs(row['name'], 'lxml')
    etf_name = soup.select_one('a').text
    esg_score = row['esg_quality_score']
    esg_quality_score_pctl_peer = row['esg_quality_score_pctl_peer']
    esg_quality_score_pctl_global = row['esg_quality_score_pctl_global']
    esg_weighted_avg_carbon_inten = row['esg_weighted_avg_carbon_inten']
    esg_sustainable_impact_pct = row['esg_sustainable_impact_pct']
    row = [symbol, etf_name, esg_score, esg_quality_score_pctl_peer , esg_quality_score_pctl_global, esg_weighted_avg_carbon_inten, esg_sustainable_impact_pct ]
    results.append(row)

headers = ['Symbol', 'ETF Name', 'ESG Score', 'ESG Score Peer Percentile (%)', 'ESG Score Global Percentile (%)',
           'Carbon Intensity (Tons of CO2e / $M Sales)', 'Sustainable Impact Solutions (%)']

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