Проблемы соскребания с селеном (xpath) в Tripadvisor - PullRequest
0 голосов
/ 14 января 2020

Я новичок в python и соскоб. Я пытаюсь извлечь информацию о TripAdvisor. Прежде всего, мне нужен Selenium для сканирования, но когда я запускаю программу в разное время, пути меняются.

Я показываю вам пример:

import urllib.request
import urllib.parse
from selenium import webdriver
import csv
from selenium.webdriver.common.action_chains import ActionChains
import time
from _datetime import datetime
from selenium.webdriver.common.keys import Keys
options=webdriver.ChromeOptions()
options.headless=False
prefs={"profile.default_content_setting_values.notofications" :2}
options.add_experimental_option("prefs",prefs)
chromedriver = "C:/Users/rober/OneDrive/Escritorio/tfm/chromedriver.exe"
driver=webdriver.Chrome(chromedriver)
driver.maximize_window()
time.sleep(5)

driver.get("https://www.tripadvisor.es/")
//*[@id="component_5"]/div/div/div/span[3]/div/div/div/a/span[2]

#Click Restaurants
driver.find_element_by_xpath('//*[@id="component_5"]/div/div/div/span[3]/div/div/div/a').click()

#Introduce localization
driver.find_element_by_xpath('//*[@id="BODY_BLOCK_JQUERY_REFLOW"]/div[14]/div/div/div[1]/div[1]/div/input').send_keys("madrid")

В последней части кода, иногда div [14] - это div [13] или div [15]. Возможно ли абсолютный xpath или использовать другую форму?

Спасибо

Ответы [ 2 ]

1 голос
/ 14 января 2020

Вы не должны использовать Xpath с более длинным путем. Это делает тест хрупким

Пожалуйста, используйте более короткие xpaths. Подобный Xpath "// input [@ class =" Smftgery "]" должен помочь вам нажать на то же поле ввода.

enter image description here

Также для нажмите на Restaurantes, вы можете использовать //*[text()='Restaurantes']

0 голосов
/ 14 января 2020

Ваш Xpath слишком специфичен c, найдите некоторую уникальность на более глубоких уровнях DOM. Эта уникальность может быть также комбинацией нескольких уровней. например, если внутри BODY_BLOCK_JQUERY_REFLOW есть только одно поле ввода, вы можете игнорировать все уровни между: '//*[@id="BODY_BLOCK_JQUERY_REFLOW"]//input'

или использовать какой-либо другой атрибут input, например, если он имеет атрибут data: //input[@data="the-data-of-the-input-field"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...