tree.xpath возвращает пустой список - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь написать программу, которая может очистить данный веб-сайт. Пока что у меня есть это:

from lxml import html
import requests

page = requests.get('https://www.cruiseplum.com/search#{"numPax":2,"geo":"US","portsMatchAll":true,"numOptionsShown":20,"ppdIncludesTaxTips":true,"uiVersion":"split","sortTableByField":"dd","sortTableOrderDesc":false,"filter":null}')

tree = html.fromstring(page.content)

date = tree.xpath('//*[@id="listingsTableSplit"]/tr[2]/td[1]/text()')

ship = tree.xpath('//*[@id="listingsTableSplit"]/tr[2]/td[2]/text()')

length = tree.xpath('//*[@id="listingsTableSplit"]/tr[2]/td[4]/text()')

meta = tree.xpath('//*[@id="listingsTableSplit"]/tr[2]/td[6]/text()')

price = tree.xpath('//*[@id="listingsTableSplit"]/tr[2]/td[7]/text()')

print('Date: ', date)
print('Ship: ', ship)
print('Length: ', length)
print('Meta: ', meta)
print('Price: ', price)

Когда это запустится, списки возвращаются пустыми.

Я очень плохо знаком с python и кодированием в целом и буду признателен за любую помощь, ребята. можем предоставить!

Спасибо

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Во-первых, ссылка, которую вы используете, неверна; это правильная ссылка (после нажатия кнопки «да» (веб-сайт загрузит данные и вернет их по этой ссылке)):

https://www.cruiseplum.com/search#{%22numPax%22:2,%22geo%22:%22US%22,%22portsMatchAll%22:true,%22numOptionsShown%22:20,%22ppdIncludesTaxTips%22:true,%22uiVersion%22:%22split%22,%22sortTableByField%22:%22dd%22,%22sortTableOrderDesc%22:false,%22filter%22:null}

Во-вторых, когда вы используете запросы чтобы получить объект ответа, данные содержимого внутри таблицы скрыты, не возвращаются:

from lxml import html
import requests

u = 'https://www.cruiseplum.com/search#{%22numPax%22:2,%22geo%22:%22US%22,%22portsMatchAll%22:true,%22numOptionsShown%22:20,%22ppdIncludesTaxTips%22:true,%22uiVersion%22:%22split%22,%22sortTableByField%22:%22dd%22,%22sortTableOrderDesc%22:false,%22filter%22:null}'
r = requests.get(u)
t = html.fromstring(r.content)

for i in t.xpath('//tr//text()'):
    print(i)

это вернет:

Recent update: new computer-optimized interface and new filters
Want to track your favorite cruises?
Login or sign up to get started.
Login / Sign Up
Loading...
Email status
Unverified
My favorites & alerts
Log out
Want to track your favorite cruises?
Login or sign up to get started.
Login / Sign Up
Loading...
Email status
Unverified
My favorites & alerts
Log out
Date Colors:
(vs. selected)
Lowest Price
Lower Price
Same Price
Higher Price

Даже если вы используете запросы_ html, содержимое по-прежнему скрытый

from requests_html import HTMLSession
session = HTMLSession()
r = session.get(u)

Вам нужно будет получить доступ к скрытому html контенту, используя селен :

from lxml import html
from selenium import webdriver
import time

u = 'https://www.cruiseplum.com/search#{%22numPax%22:2,%22geo%22:%22US%22,%22portsMatchAll%22:true,%22numOptionsShown%22:20,%22ppdIncludesTaxTips%22:true,%22uiVersion%22:%22split%22,%22sortTableByField%22:%22dd%22,%22sortTableOrderDesc%22:false,%22filter%22:null}'
driver = webdriver.Chrome(executable_path=r"C:\chromedriver.exe")
driver.get(u)

time.sleep(2)

driver.find_element_by_id('restoreSettingsYesEncl').click()
time.sleep(10) #wait until the website downoad data, without this we can't move on

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("innerHTML")

t = html.fromstring(source_code)

for i in t.xpath('//td[@class="dc-table-column _1"]/text()'):
    print(i.strip())

driver.quit()

, возвращающий первый столбец (название судна):

Costa Luminosa
Navigator Of The Seas
Navigator Of The Seas
Carnival Ecstasy
Carnival Ecstasy
Carnival Ecstasy
Carnival Victory
Carnival Victory
Carnival Victory
Costa Favolosa
Costa Favolosa
Costa Favolosa
Costa Smeralda
Carnival Inspiration
Carnival Inspiration
Carnival Inspiration
Costa Smeralda
Costa Smeralda
Disney Dream
Disney Dream

Как вы можете видеть, доступ к содержимому таблицы теперь осуществляется с использованием get_attribute ("inner HTML") из селена

Следующим шагом является очистка строк ( судно, маршрут, дни, регион ..) и сохраните их в CSV-файле (или любом другом формате), затем сделайте это для всех 4051 страниц.

0 голосов
/ 22 февраля 2020

Кажется, проблема в том, на какой URL вы переходите. Переход по этому URL-адресу в браузере приводит к появлению запроса о том, хотите ли вы восстановить поиск по закладкам.

Я не нашел простого способа обойти это. Нажатие «Да» приводит к действию javascript, а не к фактическому перенаправлению с другим параметром.

Я бы предложил использовать что-то вроде селена для достижения sh этого.

...