t.xpath не получает результаты со второй страницы? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь перебрать несколько страниц веб-сайта, однако код, который я использую ниже, возвращает результаты только с первой страницы, хотя я использую Selenium для перехода на следующую страницу. Я в растерянности из-за того, что может быть причиной этого. Любое объяснение будет высоко ценится!

Рассматриваемый веб-сайт: https://www.cruiseplum.com/search# {% 22numPax% 22: 2,% 22geo% 22:% 22US% 22,% 22portsMatchAll% 22: true,% 22numOptionsShown% 22: 100,% 22ppdIncludesTaxTips% 22: true,% 22uiVersion% 22:% 22split% 22,% 22sortTableByField% 22:% 22dd% 22,% 22sortTableOrderDesc% 22: false,% 22filter% 22: null}

from selenium import webdriver
import time
import xlsxwriter
from lxml import html

u = 'https://www.cruiseplum.com/search#{%22numPax%22:2,%22geo%22:%22US%22,%22portsMatchAll%22:true,%22numOptionsShown%22:100,%22ppdIncludesTaxTips%22:true,%22uiVersion%22:%22split%22,%22sortTableByField%22:%22dd%22,%22sortTableOrderDesc%22:false,%22filter%22:null}'
driver = webdriver.Chrome()
driver.get(u)
driver.maximize_window()

time.sleep(.3)

driver.find_element_by_id('restoreSettingsYesEncl').click() # select 'yes' on the webpage to restore settings
time.sleep(7) # wait until the website downloads data so we get a return value

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

t = html.fromstring(source_code)

for i in range(5):

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

    driver.find_element_by_xpath('//*[@id="listings-table-split"]/div[5]/div/span[4]').click() # click to next page
    time.sleep(.05)

driver.quit()

1 Ответ

0 голосов
/ 07 марта 2020

В приведенном выше коде t получает значение за пределами l oop

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

t = html .fromstring (source_code)

для i в диапазоне (5):

, поэтому он загружается только в первый раз и повторяет одни и те же элементы. Для этого вам нужно переместить его внутрь l oop, как показано в коде ниже:

from selenium import webdriver
import time
import xlsxwriter
from lxml import html

u = 'https://www.cruiseplum.com/search#{%22numPax%22:2,%22geo%22:%22US%22,%22portsMatchAll%22:true,%22numOptionsShown%22:100,%22ppdIncludesTaxTips%22:true,%22uiVersion%22:%22split%22,%22sortTableByField%22:%22dd%22,%22sortTableOrderDesc%22:false,%22filter%22:null}'
driver = webdriver.Chrome()
driver.get(u)
driver.maximize_window()

time.sleep(.3)

driver.find_element_by_id('restoreSettingsYesEncl').click() # select 'yes' on the webpage to restore settings
time.sleep(7) # wait until the website downloads data so we get a return value



for i in range(5):
    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 _0"]/text()'):
        print(i.strip())

    driver.find_element_by_xpath('//*[@id="listings-table-split"]/div[5]/div/span[4]').click() # click to next page
    time.sleep(.05)

driver.quit()
...