python tree.xpath вернуть пустой список - PullRequest
0 голосов
/ 16 января 2020

Мне трудно понять, почему метод tree.xpath, показанный в моем коде ниже, возвращает пустой список. В этом примере я просто пытаюсь получить бирки акций под баннером «Люди также смотрят» в yahoo finance, который кажется довольно банальным, но пока не смог заставить его работать.

Я копирую xpath со страницы элемента проверки. Также пытался изменить xpath вручную, например, удалить tbody, но он тоже не сработал. Любая помощь могла бы быть полезна. Спасибо

import requests
from lxml import html


ticker = 'TSLA'
url = 'https://finance.yahoo.com/quote/'+str(ticker)+'?p='+str(ticker)
page = requests.get(url)
tree = html.fromstring(page.content)
tree.xpath('//*[@id="rec-by-symbol"]/table/tbody/tr[1]/td[1]/a')```




Ответы [ 2 ]

1 голос
/ 16 января 2020

Вы пытаетесь проанализировать страницу, которая отображается в коде HTML браузером. Если вы откроете исходный код страницы - вы увидите, что у него есть один большой скрипт-тег со всеми данными для рендеринга.

У вас есть два способа справиться с этой ситуацией:

1. Рендеринг страницы и запуск XPathes в нем.

Речь идет об открытии страницы в браузере, получении от нее отрендеренного DOM и запуске XPath.

Лучший инструмент для использования в этом случае - Селен с каким-то веб-драйвером (используется для управления браузером с помощью python кода)

Пример кода для вашей ситуации:

from selenium import webdriver
driver = webdriver.Chrome()

ticker = 'TSLA'
url = 'https://finance.yahoo.com/quote/'+str(ticker)+'?p='+str(ticker)
driver.get(url)

xpath = '//*[@id="rec-by-symbol"]/table/tbody/tr[1]/td[1]/a'
found_nodes = driver.find_elements_by_xpath(xpath)

for node in found_nodes:
    print(node.text)

driver.close()
driver.quit()

Но вам нужно установить селен и скачать подходящий драйвер. Для Chrome, который я использовал в качестве примера, это будет хромированный драйвер (вы можете получить его здесь: https://chromedriver.chromium.org/):

pip install selenium

2. Разобрать скрипт в Object (особенно узел root .App.main) и работать с ним

Это более сложный способ, но без необходимости браузера.

Рабочий процесс:

a. Download page via requests;
b. Get script with target data (via regular expressions);
c. load root.App.main as json Object (json.loads method);
d. Find necessary nodes in Object.

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

0 голосов
/ 16 января 2020

Если вам не нужны какие-либо дополнительные пакеты в качестве селена, и вы хотите использовать только запросы и l xml, как я сделал сам. Я использовал regex для таких вещей:

например, вы можете просто посмотреть на page.context и найти там некоторую json структуру, которая вам нужна на сайте, например:

"NFLX":{"sourceInterval":15,"regularMarketOpen":{"raw":338.68,"fmt":"338.68"},"exchange":"NMS","regularMarketTime":{"raw":1579122001,"fmt":"4:00PM EST"},"fiftyTwoWeekRange":{"raw":"252.28 - 385.99","fmt":"252.28 - 385.99"},

и здесь вы можете найти больше информации, чем просто из l xml, но это может быть намного сложнее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...