Нет элемента в Xpath с lxml: страница, сгенерированная Javascript - PullRequest
0 голосов
/ 09 мая 2018

Раньше Xpath работал с другими вещами, в браузере Chrome я могу найти свой xpath в консоли с помощью $ x ('// * [@ id = "profile"] / div [2] / div [2 ] / div [1] / div [2] / div [2] / div [1] / span [2]) при https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na.

Когда я пытаюсь получить этот элемент в коде, он возвращает пустой массив, кто-нибудь знает почему?

@client.command(pass_context=True)
async def checkChrisPubg(ctx):
    page = requests.get('https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na')
    tree = html.fromstring(page.content)
    duoRank = tree.xpath('//*[@id="profile"]/div[2]/div[2]/div[1]/div[2]')
    print(duoRank)

печать (duoRank) дает мне []

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Итак, я попытался сделать это с помощью PyQt4 и не добился реального успеха на практике, более простое, но несколько более инвазивное решение - использовать Selenium, веб-драйвер для загрузки веб-страниц.

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

При использовании lxml вы должны убедиться, что данные, которые вы пытаетесь получить , не генерируются javascript . Для этого вы можете открыть инструменты разработчика Chrome , , щелкнуть меню (3 вертикальные точки), перейти в настройки , перейти на дно , отключите JavaScript и перезагрузите страницу .

Если ничего не существует , страница генерируется с использованием Javascript .

A простое решение ниже, это будет ждать отображения страницы, а затем позволит вам проанализировать дерево с помощью lxml.

Это решение потребует использования следующих импортов (необходимо установить селен):

from selenium import webdriver

Теперь вы можете загрузить страницу и начать очистку:

#Load in your browser(I use chrome)
browser = webdriver.Chrome()
#Choose url you want to scrape
url = 'https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na'
#get the url with Selenium
browser.get(url)
#get the innerhtml from the rendered page
innerHTML = browser.execute_script("return document.body.innerHTML")

#Now use lxml to parse the page
tree = html.fromstring(innerHTML)
#Get your element with xpath
duoRank = tree.xpath('//*[@id="profile"]/div[2]/div[2]/div[1]/div[2]/div[2]/div[1]/span[2]/text()')
#close the browser
browser.quit()

Мое оригинальное решение было бы неплохо, но просто не сработало, потому что большая часть его устарела.

0 голосов
/ 09 мая 2018

Исходный код открытой страницы view-source:https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na, вот сценарий с json playerData в строке 491 . Просто разбери это.

0 голосов
/ 09 мая 2018

Какую библиотеку вы используете в качестве парсера?

Если xml.etree.ElementTree,

ElementTree предоставляет ограниченную поддержку выражений XPath.Цель состоит в том, чтобы поддержать небольшое подмножество сокращенного синтаксиса;полный движок XPath выходит за рамки базовой библиотеки.

http://effbot.org/zone/element-xpath.htm

...