Я хочу получить исходный код документа 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.
Вы не можете получить iframeinnerHTML, вы должны перенаправить на него src
Присутствует ли интересующий iframe в первоначальном ответе, поскольку это не всегда так, тогда вы не сможете извлечь src из ответа, чтобы сделать следующий запрос, хотя вы можете вручную взять src с веб-страницы и выполнить против этого.
@QHarr он присутствует в первоначальном ответе, но перенаправление на его src не так уж полезно ... в любом случае, я получил ответ, переключив фрейм драйвера
Дох.... надо было это сказать!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Зачем вам HTML document в html-документе? Я думаю, что это невозможно, но вы можете попробовать разместить HTLM-документ на другом сайте, а не использовать <iframe src = "www.html-content.com"></iframe>
Также есть способ с использованием jQuery. Для этого я бы посоветовал вам посмотреть эту тему: связь
Я не хочу включать html-файл в html-файл, вместо этого у меня есть исходный код веб-страницы, то есть он мне уже предоставлен... Можете ли вы подробнее рассказать об этой переменной #document? Я вижу это впервые, из-за чего я не могу получить html-код, который находится внутри него.
Документ @ArihantBedagkar — это виртуальный элемент, который на самом деле ничего не значит.
@ArihantBedagkar больше о #document на: stackoverflow.com/questions/21474605/что означает документ
@ Скотт, ссылка, которую вы предоставили, сработала для меня как шарм! Оставалось только переключить драйвер на новую раму. Большое спасибо!
Вы не можете получить содержимое 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 недоступен для доступа, код не работает... но я нашел свой ответ. Спасибо большое за вашу помощь!
Ответ прост,
Я только что переключился с текущего кадра на кадр элемента <iframe>
Код:
driver.switch_to.default_content()
frame = driver.find_element_by_xpath('//iframe')
driver.switch_to.frame(frame)
Как насчет получения URL-адреса iframe, а затем снова вызовите driver.get с этим URL-адресом. См. Скотт также предложил это, и он также предоставил фрагмент кода.