Во-первых, ссылка, которую вы используете, неверна; это правильная ссылка (после нажатия кнопки «да» (веб-сайт загрузит данные и вернет их по этой ссылке)):
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 страниц.