Не могу получить значение из XPath - PullRequest
0 голосов
/ 27 апреля 2020

код ниже. Предполагается вернуть значение "INDICES", вместо этого он возвращает пустое значение? Я видел, как это работает на других сайтах, но, похоже, не работает здесь. Все попытки ниже возвращают пустое значение

import requests
from lxml import html

pageContent=requests.get('https://finviz.com/futures.ashx')
tree = html.fromstring(pageContent.content)
Indicies = tree.xpath('//div[contains(@class, "tile_header is-indices")]//*')
Indicies = tree.xpath('//*[@id="futures"]/div/div[2]/div[1]/a[1]/div[1]/text()')
Indicies = tree.xpath('/html/body/div[2]/div/div/div/div[2]/div[1]/a[1]/div[1]')
print([e.text_content() for e in tree.xpath('//div[@class="tile_header is-indices" and @style]')])
Indicies = tree.xpath("//div[contains(text(), 'tile_header is-indices')]//*")
Indicies = tree.xpath("//a[contains(text(), 'tile_header is-indices')]//*")
var groups = [{"ticker":"INDICES","label":"Indices","contracts":[{"label":"DJIA","ticker":"YM","cot":"124601,124603"}

1 Ответ

1 голос
/ 27 апреля 2020

Что происходит?

На странице, которую вы пытаетесь очистить, отображается содержимое после выполнения кода javascript (вот разницу, которую вы можете найти между страницей, которую вы получили с помощью curl, и страницей, проверенной в вашем браузер), поэтому перед использованием l xml, чтобы найти то, что вам нужно, вам нужно кое-что, чтобы помочь вам визуализировать javascript.

Ввод селена

Selenium поможет вам в этой задаче. Это автоматизация для (веб) брокеров, а это значит, что вам понадобится аддон webdriver (есть несколько вариантов: gecko, chrome, opera, et c.), Которые можно загрузить с помощью менеджера пакетов операционной системы или загрузите их вручную, добавьте их в PATH или используйте executable_path="location\to\geckodriver.exe" при вызове веб-драйвера.

Теперь, как это будет выглядеть в вашем коде (с использованием chrome в качестве веб-драйвера)?

from selenium import webdriver
from lxml import html
driver = webdriver.Chrome()
driver.get('https://finviz.com/futures.ashx')

tree = html.fromstring(driver.page_source)
Indicies = tree.xpath('//div[contains(@class, "tile_header is-indices")]//*')
Indicies = tree.xpath('//*[@id="futures"]/div/div[2]/div[1]/a[1]/div[1]/text()')
Indicies = tree.xpath('/html/body/div[2]/div/div/div/div[2]/div[1]/a[1]/div[1]')
print([e.text_content() for e in tree.xpath('//div[@class="tile_header is-indices" and @style]')])
Indicies = tree.xpath("//div[contains(text(), 'tile_header is-indices')]//*")
Indicies = tree.xpath("//a[contains(text(), 'tile_header is-indices')]//*")

driver.quit()

Теперь вы можете указать некоторые параметры, чтобы он мог работать без вывода сообщений (--log-level = 3), без заголовка (--headless) и т. Д., А сам аргумент будет зависеть от используемого вами веб-драйвера.

from selenium.webdriver.chrome.options import Options
chrome_options.add_argument("--add-first-thing")
chrome_options.add_argument("--add-second-thing")
driver = webdriver.Chrome(options=chrome_options)

Как видите, Selenium поможет вам визуализировать вашу страницу, а затем вы сможете проанализировать ее как l xml, Beautiful Soup или сам Selenium.

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