Python / Dynami c Разбор: не могу ничего разобрать внутри - PullRequest
0 голосов
/ 05 августа 2020

Я хотел проанализировать информацию с определенного веб-сайта , и у меня возникли проблемы с аспектом Dynami c. Когда запрос вызывается в python для этого сайта с BeautifulSoup, et c., Всего в там нет.

Согласно ответу на этот аналогичный вопрос - Почему не анализируется код html внутри div? - Я пытался использовать браузер без головы. Я закончил тем, что попытался использовать селен и осколок с включенными опциями --headless для chrome.

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

Примечания: Работает на Ubunutu 20.04.1 LTS и Python 3.8.3. Если вы хотите предложить другие программы браузера без головы, go впереди, но они должны быть совместимы со всеми linux, ma c, et c. и Python.

Ниже представлен мой последний код. Я пробовал разными способами «найти» кнопку, которую хочу нажать. Здесь я попытался использовать xpath нужного мне элемента, который я получил через inspect:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--ignore-certificate-errors')

with Browser('chrome', options=options) as browser:
    browser.visit("http://gnomad.broadinstitute.org/region/16-2087388-2087428?dataset=gnomad_r2_1")
    print(browser.title)
    browser.find_by_xpath('//*[@id="root"]/div/div/div[2]/div/div[3]/section/div[2]/button').first.click() 

Сообщение об ошибке, которое это дало мне, было:

File "etc/anaconda3/lib/python3.8/site-packages/splinter/element_list.py", line 42, in __getitem__ 
    return self._container[index]
IndexError: list index out of range

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний звонок последний): Файл "practice3.py", строка 20, в browser.find_by_xpath ('// [@ id = "root"] / div / div / div [2] / div / div [3] / section / div [2] / button'). первый. нажмите () Файл "etc / anaconda3 / lib / python3 .8 / site-packages / splinter / element_list.py", строка 57, сначала вернуть себя [0] Файл "etc / anaconda3 / lib / python3 .8 / site-packages / splinter / element_list.py", строка 44, в getitem поднять ElementDoesNotExist ( splinter.exceptions.ElementDoesNotExist: не удалось найти элементы с xpath "// [@id = "root"] / div / div / div [2] / div / div [3] / section / div [2] / button »

Спасибо!

1 Ответ

0 голосов
/ 05 августа 2020

Кажется, ваша проблема в том, что вы не дожидаетесь полной загрузки элементов. Я настроил среду вашего фрагмента кода и распечатал источник веб-сайта, прогнал ответ с помощью html beautifier https://www.freeformatter.com/html-formatter.html#ad -output

Здесь я обнаружил, что div, к которому вы хотите получить доступ, имеет состояние

<div class="StatusMessage-xgxrme-0 daewTb">Loading region...</div>

, что означает, что сайт еще не полностью загружен. Чтобы исправить это, вы можете просто дождаться загрузки веб-сайта, что может сделать селен

from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="root"]/div/div/div[2]/div/div[3]/section/div[2]/button')))

Это будет ждать, пока элемент будет загружен и станет доступным для клика.

Вот фрагмент кода I протестировано на

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--ignore-certificate-errors')

with webdriver.Chrome("<path-to-driver>", options=options) as browser:
    browser.get("http://gnomad.broadinstitute.org/region/16-2087388-2087428?dataset=gnomad_r2_1")
    WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="root"]/div/div/div[2]/div/div[3]/section/div[2]/button')))
    print(browser.title)
    print(browser.page_source)
    b = browser.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/div/div[3]/section/div[2]/button')
    browser.execute_script("arguments[0].click()", b)

Просто замените с путем к вашему chrome webdriver.

Последний бит, потому что я получил ошибку от нажатия кнопки, которая selenium.common.exceptions.ElementClickInterceptedException: Сообщение: нажатие элемента перехвачено: Элемент нельзя щелкнуть с помощью Selenium и решено Python.

...