XPath возвращает разные результаты, используя Chrome Plugin и Python - PullRequest
0 голосов
/ 23 декабря 2018

Я изо всех сил пытаюсь использовать XPath в HTML-коде для поиска необходимой мне информации.

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

import requests
from lxml import html


#specify the url
base_url = 'https://www.lolesports.com/en_US/na- 
lcs/na_2018_summer/schedule/regular_season/2'

#query the website and return the html to the variable ‘html_code’
html_code = requests.get(base_url)

tree = html.fromstring(html_code.content)
my_nodes = tree.xpath('//a[@id="ember9461"]') ## here it keeps returning an empty list

Пробовал несколько запросов, которые не все работают, кроме широкого подстановочного знака "// *", который я не могу проанализировать дальше.

Я хочу проанализировать ссылки, предоставленные в href (например) 'a id = "ember9461" ....... / a' для каждой игры в неделю.Так что было бы лучше вернуть список со всеми этими ссылками или хотя бы что-то, содержащее ссылки, которые я могу проанализировать.Но, как я уже говорил, я продолжаю получать пустой массив, хотя это правильный XPath, показанный из плагина XPath от Chrome.

Любая помощь приветствуется.Спасибо!

Это мой первый вопрос здесь, я вернусь, чтобы добавить скриншоты, если узнаю, как:)

РЕДАКТИРОВАТЬ: Был задан вывод: Ну, я не получаюошибка, просто описанный пустой список для "my_nodes".Я использую PyCharm 8.13.

my_nodes = {list}<class 'list'>: []

Я бы ожидал чего угодно, кроме пустого списка, поскольку запросы работают с плагином XPath.

Вот скриншот, объясняющий проблему:

запрос с плагином XPath

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Я думаю, вам может понадобиться метод, такой как селен, где вы можете прокрутить, чтобы сгенерировать все ссылки и выделить время для их присутствия

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin
base = 'https://www.lolesports.com'
url = 'https://www.lolesports.com/en_US/na-lcs/na_2018_summer/schedule/regular_season/1'
d = webdriver.Chrome()
d.get(url)
WebDriverWait(d, 20).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".throbber-loader")))
copyright = WebDriverWait(d, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".copyright-text")))
d.execute_script("return arguments[0].scrollIntoView(true);", copyright)
WebDriverWait(d,5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.ember-view')))
soup = bs(d.page_source,'lxml')
links = [urljoin(base,link.get('href')) for link in soup.select('.ember-view') if link.get('href')]
print(len(links))
print(links)
d.quit()

Только селен:

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

base = 'https://www.lolesports.com'
url = 'https://www.lolesports.com/en_US/na-lcs/na_2018_summer/schedule/regular_season/1'
d = webdriver.Chrome()
d.get(url)
WebDriverWait(d, 20).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".throbber-loader")))
copyright = WebDriverWait(d, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".copyright-text")))
d.execute_script("return arguments[0].scrollIntoView(true);", copyright)
elems = WebDriverWait(d,5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.ember-view[href]')))

links = []
for elem in elems:
    links.append(urljoin(base,elem.get_attribute('href')))

print(len(links))
print(links)
d.quit()
0 голосов
/ 23 декабря 2018

и веселого Рождества вам тоже:)

Насколько я знаю, ваш синтаксис правильный и действительно что-то возвращает.Дело в том, что он не возвращает то, что можно проанализировать с помощью вашего запроса XPath (проверьте html_content), чтобы убедиться в этом.Это объясняет, почему возвращается пустой список.

Надеюсь, это поможет.

...