Как получить html-документ, содержащийся внутри тега HTML, с помощью селена в python

Я хочу получить исходный код документа HTML, который находится внутри тега HTML, который генерируется после некоторого JavaScript, и сохранить его в переменной. Здесь тег HTML — это <iframe>, и он содержит переменную типа чего-то похожего на #document, и когда я расширяю его, я получаю HTML-документ, который выглядит примерно так <!DOCTYPE html> <html>...</html>

Обобщить:

<iframe src = "https://www.XXXXXX.com/" allow = "autoplay; fullscreen" frameborder = "no" scrolling = "no" allowfullscreen = "yes" style = "width: 100%; height: 100%;">
    #document
        <!DOCTYPE html>
        <html>...</html>  // a whole new HTML document
</iframe>

Я хочу сохранить все содержимое этого HTML-документа в виде строки в python.

Что я сделал:

driver.find_element_by_xpath('/path/to/iframe/tag').get_attribute('innerHTML')

но это просто возвращает пустую строку. Кроме того, я проверил, работает ли он с BeautifulSoup.

html = driver.execute_script("return document.body.innerHTML")
soup = BeautifulSoup(html, 'html5lib')
print(soup.prettify())

но это тоже не работает

ПРИМЕЧАНИЕ: Я запускаю эти тесты только после выполнения скрипта, также я думаю, что проблема связана с #document.

Как насчет получения URL-адреса iframe, а затем снова вызовите driver.get с этим URL-адресом. См. Скотт также предложил это, и он также предоставил фрагмент кода.

Stephan Schrijver 28.05.2019 20:05

Вы не можете получить iframeinnerHTML, вы должны перенаправить на него src

Mohammad Zamanian 28.05.2019 20:09

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

QHarr 28.05.2019 20:39

@QHarr он присутствует в первоначальном ответе, но перенаправление на его src не так уж полезно ... в любом случае, я получил ответ, переключив фрейм драйвера

Arihant Bedagkar 28.05.2019 20:45

Дох.... надо было это сказать!

QHarr 28.05.2019 20:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
690
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Зачем вам HTML document в html-документе? Я думаю, что это невозможно, но вы можете попробовать разместить HTLM-документ на другом сайте, а не использовать <iframe src = "www.html-content.com"></iframe>

Также есть способ с использованием jQuery. Для этого я бы посоветовал вам посмотреть эту тему: связь

Kaochi 28.05.2019 20:02

Я не хочу включать html-файл в html-файл, вместо этого у меня есть исходный код веб-страницы, то есть он мне уже предоставлен... Можете ли вы подробнее рассказать об этой переменной #document? Я вижу это впервые, из-за чего я не могу получить html-код, который находится внутри него.

Arihant Bedagkar 28.05.2019 20:07

Документ @ArihantBedagkar — это виртуальный элемент, который на самом деле ничего не значит.

Mohammad Zamanian 28.05.2019 20:13

@ArihantBedagkar больше о #document на: stackoverflow.com/questions/21474605/что означает документ

Mohammad Zamanian 28.05.2019 20:14

@ Скотт, ссылка, которую вы предоставили, сработала для меня как шарм! Оставалось только переключить драйвер на новую раму. Большое спасибо!

Arihant Bedagkar 28.05.2019 20:38

Вы не можете получить содержимое iframe с помощью innerHTML, так как вы не можете сделать это даже с помощью javascript внутри самодельного html-документа, например:

function Button(){
    var iframe = document.getElementsByTagName("iframe")[0];
    var p = document.getElementsByTagName("p")[0];
    p.innerHTML = "Result of iframe.innerHTML: " + iframe.innerHTML;
}
<iframe src = "https://bing.com/"></iframe>
<br>
<button onclick = "Button();">Click me to alert innerHTML</button>
<p></p>

Вместо этого вы хотите перенаправить на iframe src и получить html-контент.

Не тестировал следующий код, но надеюсь, он вам поможет.

driver = webdriver.Firefox(executable_path=firefox_path, firefox_profile=firefox_profile)
driver.get('https://example.com/')
documentText = driver.page_source

soup =  BeautifulSoup(documentText)
iframe_source = soup.find('iframe')['src']

driver.get(iframe_source)

documentText = driver.page_source
soup = BeautifulSoup(documentText)
html = soup.find('html')

print(html.content)

Я попытался протестировать предоставленный вами код, но, поскольку URL-адрес src недоступен для доступа, код не работает... но я нашел свой ответ. Спасибо большое за вашу помощь!

Arihant Bedagkar 28.05.2019 20:39
Ответ принят как подходящий

Ответ прост, Я только что переключился с текущего кадра на кадр элемента <iframe>

Код:

driver.switch_to.default_content()
frame = driver.find_element_by_xpath('//iframe')
driver.switch_to.frame(frame)

Другие вопросы по теме