Извлечение данных из таблицы из CoinMarketCap

#python #beautifulsoup #screen-scraping

Вопрос:

Заранее извините за несоблюдение каких-либо рекомендаций, это мой первый пост.

Проблема заключается в следующем: я создаю бота для проверки криптовалют — один из шагов состоит в том, чтобы получить биржи, на которых указана монета. Я планирую сделать это, очистив таблицу на вкладке «Рынок» (т. е. https://coinmarketcap.com/currencies/valor-token/markets/ -> bithumb, ascendex и так далее).

Я пробовал использовать BeautifulSoup с регулярным выражением

 soup = BeautifulSoup(html_page, 'html.parser')
table = soup.findAll("table", {"class" : re.compile('cmc-tab*')})

and 

def check_currency_markets(slug):
    url = "https://coinmarketcap.com/currencies/" slug "/markets"
    html_content = requests.get(url).text
    soup = BeautifulSoup(html_content, 'lxml')
    print(soup.prettify())
    with open('sopa.txt', 'w') as fil:
        fil.write(str(soup.prettify()))
        fil.close()
 

и панды

 def check_currency_markets(slug):
    url = "https://coinmarketcap.com/currencies/" slug "/markets"
    dfs = pd.read_html(url)

    for df in dfs:
        writer = pd.ExcelWriter(str(int(time.time())) ".xlsx")
        df.to_excel(writer)
        writer.save()

 

но ни один из них не работает. Одна вещь, которую я заметил, когда использую BeautifulSoup, заключается в том, что возвращаемая им строка не содержит тега «таблица», но она существует в коде страницы.*

Не могли бы вы, пожалуйста, помочь мне с извлечением этой таблицы страницы(или списка обменов)?

*Что может быть причиной этого?

Я знаю, что могу использовать API для этого, но я потратил довольно много времени, пытаясь решить эту проблему, и мне действительно хотелось бы знать решение.

Редактировать: Вот что возвращает BeautifulSoup

Edit2: Я наконец-то сделал это с помощью Селена. Теперь строка, возвращаемая BeautifulSoup, содержит элементы, которые я ищу, и я могу их извлечь.

 def check_currency_markets(slug):
    url = "https://coinmarketcap.com/currencies/" slug "/markets"

    browser = webdriver.Chrome(r'chromedriver.exe')
    browser.get(url)

    html = browser.page_source
    soup = BeautifulSoup(html, 'lxml')
    
    print(soup.prettify())
    with open('sopa.txt', 'w') as fil:
        fil.write(str(soup.prettify()))
        fil.close()
 

Комментарии:

1. Можете ли вы опубликовать полный код? Облегчает воспроизведение ошибок и их исправление.

2. Что возвращает BeautifulSoup? Я подозреваю, что это связано с тем, как/в каком порядке вещи загружаются на страницу. — т. е., скорее всего, javascript отображает элементы, такие как «таблица», после загрузки исходного HTML-документа.

3. Быстрая проверка с помощью Chrome DevTools, похоже, это так. Вам придется немного покопаться-я знаю, что подобные вопросы уже есть в StackOverflow. Это может быть проблемой, поскольку я вижу, что JavaScript на странице запутан.