Веб-парсинг данных в индикаторе производительности - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь очистить данные в виджете, используя python и библиотеку запросов- html.

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

Каждая стрелка имеет уникальное имя класса.

<div class="arrow-F-uE7IX8 arrowToStrongBuy-1ydGKDOo arrowStrongBuyShudder-3xsGK8k5">
https://www.tradingview.com/symbols/NASDAQ-MDB/
StrongBuy:

<div class="arrow-F-uE7IX8 arrowToBuy-1R7d8UMJ arrowBuyShudder-3GMCnG5u">
https://www.tradingview.com/symbols/NYSE-XOM/
Buy:

<div class="arrow-F-uE7IX8 arrowToStrongSell-3UWimXJs arrowStrongSellShudder-2UJhm0_C">
https://www.tradingview.com/symbols/NASDAQ-IDEX/ 
StrongSell:

Что я могу сделать, чтобы получить правильное значение? Я не уверен, как я могу проверить, содержит ли селектор arrowTo { foo } и сохранить как переменную.

import pyppdf.patch_pyppeteer
from requests_html import AsyncHTMLSession
asession = AsyncHTMLSession()


async def get_page():
    code = 'NASDAQ-MDB'
    r = await asession.get(f'https://www.tradingview.com/symbols/{code}/')
    await r.html.arender(wait=3)
    return r

results = asession.run(get_page)
for result in results:

    arrow_class_placeholder = "//div[contains(@class,'arrow-F-uE7IX8 arrowToStrongBuy-1ydGKDOo')]//div[1]"
    arrow_class_name = result.html.xpath(arrow_class_placeholder,first=True)

    if arrow_class_name == "//div[contains(@class,'arrow-F-uE7IX8 arrowToStrongBuy-1ydGKDOo')]//div[1]":
        print('StrongBuy')
    else:
        print('not strong buy')

1 Ответ

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

Вы можете использовать BeautifulSoup4 (bs4) , которая представляет собой Python библиотеку для извлечения данных из файлов HTML и XML с комбинацией регулярных выражений (RegEx) . В этом случае я использовал библиотеку python re для целей RegEx.

Что-то вроде этого - это то, что вы хотите ( источник ):

enter image description here

В приведенном выше примере soup.find_all(class_=re.compile("itle")) возвращает все экземпляры, в которых слово «itle» встречается в теге класса, например class = "title" из документа html, показанного ниже.

enter image description here

Для вашего RegEx это будет выглядеть примерно как "arrowTo*" или даже просто "arrowTo". soup.find_all(class_=re.compile("arrowTo")).

Ваш окончательный код должен выглядеть примерно так:

from bs4 import BeautifulSoup
#i think result was your html document from requests library
#the first parameter is your html document variable
soup = BeautifulSoup(result, 'html.parser') 
myArrowToList = soup.find_all(class_=re.compile("arrowTo"))

Если вы хотите "arrowToStrongBuy", просто используйте его во входных данных регулярного выражения для функции find_all.

soup.find_all(class_=re.compile("arrowToStrongBuy"))
...