парсинг фондовых новостей Yahoo - PullRequest
1 голос
/ 11 июля 2020

Я просматриваю статьи новостей, связанные с Infosys, в конце страницы, но получаю ошибку selenium.common.exceptions.InvalidSelectorException: Сообщение: недопустимый селектор. Хотите очистить все статьи, связанные с Infosys.

from bs4 import BeautifulSoup
import re
from selenium import webdriver
import chromedriver_binary
import string
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

driver = webdriver.Chrome("/Users/abhishekgupta/Downloads/chromedriver")
driver.get("https://finance.yahoo.com/quote/INFY/news?p=INFY")

for i in range(20): # adjust integer value for need
       # you can change right side number for scroll convenience or destination 
       driver.execute_script("window.scrollBy(0, 250)")
       # you can change time integer to float or remove
       time.sleep(1)

print(driver.find_element_by_xpath('//*[@id="latestQuoteNewsStream-0-Stream"]/ul/li[9]/div/div/div[2]/h3/a/text()').text())

Ответы [ 3 ]

2 голосов
/ 11 июля 2020

Вы можете использовать менее подробный xpath, используя // вместо /div/div/div[2]

И если вам нужен последний элемент, тогда получите все li как список, а затем используйте [-1], чтобы получить последний элемент в списке

from selenium import webdriver
import time

driver = webdriver.Chrome("/Users/abhishekgupta/Downloads/chromedriver")
#driver = webdriver.Firefox()

driver.get("https://finance.yahoo.com/quote/INFY/news?p=INFY")

for i in range(20):
       driver.execute_script("window.scrollBy(0, 250)")
       time.sleep(1)

all_items = driver.find_elements_by_xpath('//*[@id="latestQuoteNewsStream-0-Stream"]/ul/li')

#for item in all_items:
#    print(item.find_element_by_xpath('.//h3/a').text)
#    print(item.find_element_by_xpath('.//p').text)
#    print('---')
    
print(all_items[-1].find_element_by_xpath('.//h3/a').text)
print(all_items[-1].find_element_by_xpath('.//p').text)
0 голосов
/ 11 июля 2020

Я думаю, ваш код хорош только в одном: есть небольшая разница, когда мы извлекаем текст или ссылки при использовании xpath в селене по сравнению с scrapy или если вы используете библиотеку l xml fromstring, так что вот что должно работать для вас

#use this code for printing instead 
print(driver.find_element_by_xpath('//*[@id="latestQuoteNewsStream-0- Stream"]/ul/li[9]/div/div/div[2]/h3/a').text)

Даже если вы это сделаете, он будет работать так же, поскольку есть только один элемент с этим идентификатором, поэтому просто используйте

#This should also work fine
print(driver.find_element_by_xpath('//*[@id="latestQuoteNewsStream-0- Stream"]').text)
0 голосов
/ 11 июля 2020

Указанный вами xPath не существует на странице.

Загрузите xPath Finder Chrome Расширение, чтобы найти правильный xPath для статей.

Вот пример xPath списка статей, вам нужно l oop через id:

/html/body/div[1]/div/div/div[1]/div/div[3]/div[1]/div/div[5]/div/div/div/ul/li[ID]/div/div/div[2]/h3/a/u
...