Как получить элемент с помощью xapth, когда этот элемент не отображается, пока вы не используете метод .click () И этот элемент находится в части JavaScript, в чем-то, называемом BODY_BLOCK_JQUERY_REFLOW.
Я пытаюсь получить доступ к этой части HTML.
<div class="ui_radio item" data-value="it" data-tracker="Italian">
<input id="filters_detail_language_filterLang_it" type="radio" name="filters_detail_language_filterLang_1" value="it" onchange="widgetEvCall('handlers.updateFilter', event, this);">
<label for="filters_detail_language_filterLang_it" class="label">Italian <span class="count">(11)</span>
</label>
</div>
Я могу получить доступ к предыдущим языкам 1 - 3, но когда я выбираю 4-й язык (и более), я не могу разобрать xpaths, потому что он отображается как наложение.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
import time
from lxml import html
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--windows-size=1080*720")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-proxy-server")
headers = {'User-Agent': ''}
proxies = {"http": ''}
chrome_driver = os.getcwd() + "/chromedriver"
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome_driver)
driver.get("https://www.tripadvisor.com/Attraction_Review-g60776-d117416-Reviews-Colorado_National_Monument-Fruita_Colorado.html")
# here we click on the more languages element
driver.find_element_by_xpath("""//*[@id="taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[5]""").click()
html_thing = driver.page_source
innerHTML = driver.execute_script("return document.body.innerHTML")
parser = html.fromstring(html_thing)
#T hese XPATHS work since they are part of the DOM on intial load
XPATH_LANG1 = '//*[@id="taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[2]/label/text()'
XPATH_LANG_COUNT1 = '//*[@id="taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div/div[2]/label/span//text()'
XPATH_LANG2 = '//*[@id="taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[3]/label/text()'
XPATH_LANG_COUNT2 = '//*[@id="taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div/div[3]/label/span//text()'
XPATH_LANG3 = '//*[@id="taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[4]/label/text()'
XPATH_LANG_COUNT3 = '//*[@id="taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[4]/label/span//text()'
# Unfortunately, these XPATHS dont work. Im assuming because they are in this JQUERY thing.
XPATH_LANG4 = """//*[@id="BODY_BLOCK_JQUERY_REFLOW"]/div[12]/div[2]/div/div[5]/label/text()"""
print(XPATH_LANG4, 'this is lang 4')
raw_lang1 = parser.xpath(XPATH_LANG1)
print(raw_lang1)
raw_lang_count1 = parser.xpath(XPATH_LANG_COUNT1)
print(raw_lang_count1)
raw_lang2 = parser.xpath(XPATH_LANG2)
print(raw_lang2)
raw_lang_count2 = parser.xpath(XPATH_LANG_COUNT2)
print(raw_lang_count2)
raw_lang3 = parser.xpath(XPATH_LANG3)
print(raw_lang3)
raw_lang_count3 = parser.xpath(XPATH_LANG_COUNT3)
print(raw_lang_count3)
raw_lang4 = parser.xpath(XPATH_LANG4)
if not raw_lang4:
print(raw_lang4, '<--------------- THIS IS EMPTY')
else:
print(raw_lang4, 'It actually showed up')
driver.close()
driver.quit()
Я пытался использовать `driver.find_element_by_xpath (" "" "" "), я пробовал парсеры и все остальное, что я могу придумать.
Проблема, похоже, заключается в том, что хотя язык, в данном случае «итальянский» (4-й язык в оверлее) находится в источнике страницы, XPATH не может его увидеть. Это сложная задача, поскольку на странице используются динамические идентификаторы или их вообще нет.