Как получить HTML-документ, содержащийся внутри тега HTML, используя селен в Python - PullRequest
1 голос
/ 28 мая 2019

Я хочу получить исходный код документа 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 вещь

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Вы не можете получить контент 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)
0 голосов
/ 28 мая 2019

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

Код:

driver.switch_to.default_content()
frame = driver.find_element_by_xpath('//iframe')
driver.switch_to.frame(frame)
0 голосов
/ 28 мая 2019

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

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