uptownnegative
@uptownnegative

Как вытащить табличные данные из html?

Обучаюсь написанию парсеров. Сейчас моей задачей является парсинг табличных данных с сайта https://coinmarketcap.com/ , где мне нужны непосредственно данные с таблицы криптовалют, их стоимости и т.д., которые лежат в блоке tbody.
Но когда с помощью Beautiful Soup пробую попасть в таблицу, в объект tbody, выдаёт "AttributeError: 'NoneType' object has no attribute 'find_all'". При этом объект thead он видит прекрасно и никаких ошибок нет. Как мне всё таки добиться того, чтобы программа видела этот блок сайта?
Пробовал уже все возможные перестановки кода, какие-то замены в элементах, но ничего не помогает, и программа все равно не видит тело таблицы.
import requests
from bs4 import BeautifulSoup
import csv

def get_html(url):
    r = requests.get(url)
    return r.text

def write_csv(data):
    with open('cmc.csv', 'a') as f:
        writer = csv.writer(f)
        pass

def get_page_data(html): 
    soup = BeautifulSoup(html, 'lxml')
    trs = soup.find('table').find('tbody').find_all('tr')
    print(len(trs))


def main():
    url = 'https://coinmarketcap.com/'
    get_page_data(get_html(url))

if __name__ == '__main__':
    main()

H-6RDenqcuc.jpg
  • Вопрос задан
  • 2391 просмотр
Решения вопроса 1
hottabxp
@hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
На быструю руку склепал. Не факт что код правильный, но рабочий:
Старый код:
import requests
from bs4 import BeautifulSoup

url = 'https://coinmarketcap.com/'
r = requests.get(url)

soup = BeautifulSoup(r.text, 'lxml')
all = soup.find_all('',class_='cmc-table-row')

for x in all:
	rank = x.find('td',class_='cmc-table__cell--sort-by__rank').text
	name = x.find('td',class_='cmc-table__cell--sort-by__name').text
	market_cap = x.find('td',class_='cmc-table__cell--sort-by__market-cap').text
	price = x.find('td',class_='cmc-table__cell--sort-by__price').text
	volume = x.find('td',class_='cmc-table__cell--sort-by__volume-24-h').text
	circulating_supply = x.find('td',class_='cmc-table__cell--sort-by__circulating-supply').text
	change = x.find('td',class_='cmc-table__cell--sort-by__percent-change-24-h').text
	print(f'{rank} {name} {market_cap} {price} {volume} {circulating_supply} {change}')

5e39a5a9404ac829063108.png

UPDATE 22.10.20:
import requests
from bs4 import BeautifulSoup

url = 'https://coinmarketcap.com/'
r = requests.get(url)

soup = BeautifulSoup(r.text, 'lxml')
all = soup.find_all('',class_='cmc-table-row')

for x in all:
  rank = x.find('td',class_='rc-table-cell table-col-rank rc-table-cell-fix-left').text
  name = x.find('a',class_='cmc-link').find('p').text
  market_cap = x.find('td',class_='rc-table-cell font_weight_500___2Lmmi').text
  price = x.find('td',class_='rc-table-cell font_weight_500___2Lmmi').text
  volume = x.find('div',class_='Box-sc-16r8icm-0 sc-1anvaoh-0 gxonsA').a.p.text
  circulating_supply = x.find('p',class_='Text-sc-1eb5slv-0 kqPMfR').text
  # change = x.find('td',class_='cmc-table__cell--sort-by__percent-change-24-h').text
  print(f'{rank} {name} {market_cap} {price} {volume} {circulating_supply}')
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
pytablereader не помог?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы