Как использовать Selenium + BeautifulSoup для получения данных из динамически создаваемых элементов - PullRequest
0 голосов
/ 03 апреля 2020

Первый вопрос по StackOverFlow. Я пытаюсь очистить веб fxstreet.com / news . Кажется, что их новостная лента динамически создает статьи. BeautifulSoup не может собрать эту информацию, поэтому я решил использовать Selenium. Однако у меня возникают проблемы с использованием Selenium для доступа к отображаемым статьям.

import requests
from bs4 import BeautifulSoup
import re
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.fxstreet.com/news?q=&hPP=17&idx=FxsIndexPro&p=0')

article = driver.find_element_by_link_text('/news')
for post in article:
    print(post.text)

Я хотел бы сделать скребок, который периодически проверяет наличие новых статей, эти статьи будут иметь URL-адрес: https://www.fxstreet.com/news... (конечная точка) .

Однако, когда я пытаюсь найти тег hrefs / 'a', я получаю много ссылок по всему сайту, но ни одна из них не является новостными статьями, размещенными в прямом эфире. Когда я смотрю на каждый отдельный div, я выкладываю для меня целое html:

                    <article class="fxs_entriesList_article_with_image ">
                    <h3 class="fxs_entryHeadline">
                        <a href="https://www.fxstreet.com/news/gbp-usd-upside-potential-limited-in-covid-19-uncertainties-202004021808" title="GBP/USD upside potential limited in COVID-19 uncertainties">GBP/USD upside potential limited in COVID-19 uncertainties</a>
                    </h3>
                    <address class="fxs_entry_metaInfo">
                        <span class="fxs_article_author">
                            By <a href="/author/ross-j-burland" rel="nofollow">Ross J Burland</a>
                        </span> | <time pubdate="" datetime="">18:08 GMT</time>
                    </address>
                </article>

, говорящее мне, что оно где-то существует, так или иначе, но я совершенно не могу с ним взаимодействовать. Итак, как мне получить доступ к нужным ссылкам, когда Selenium не может найти теги 'a' или частичные ссылки? Я также пытался найти точную ссылку, используя:

elem = driver.find_elements_partial_link("news")

for element in elem:
       print(element.get_attribute("innerHTML"))

Безрезультатно. Я также попытался выставить явные и неявные ожидания. Спасибо.

1 Ответ

0 голосов
/ 03 апреля 2020

Пожалуйста, используйте ниже css, чтобы получить все ссылки, связанные с новостями.

h4.fxs_headline_tiny a

дополнительные импорты необходимы для явного ожидания.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

Ваш код должен быть таким, как показано ниже .

url = "https://www.fxstreet.com/news?q=&hPP=17&idx=FxsIndexPro&p=0"
driver.get(url)
WebDriverWait(driver,120).until(EC.presence_of_element_located((By.CSS_SELECTOR,"h4.fxs_headline_tiny a")))
news_elems = driver.find_elements_by_css_selector("h4.fxs_headline_tiny a")
for ele in news_elems:
    print(ele.get_attribute('href'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...