Python Selenium, який отримує доступ до джерела HTML


97

Як я можу отримати джерело HTML у змінній за допомогою модуля Selenium з Python?

Я хотів зробити щось подібне:

from selenium import webdriver

browser = webdriver.Firefox()
browser.get("http://example.com")
if "whatever" in html_source:
    # Do something
else:
    # Do something else

Як я можу це зробити? Я не знаю, як отримати доступ до джерела HTML.


2
Перед умовою напишіть наступний рядок: html_source = browser.page_source
Abdul Majeed

Відповіді:


191

Вам потрібно отримати доступ до page_sourceпомешкання:

from selenium import webdriver

browser = webdriver.Firefox()
browser.get("http://example.com")

html_source = browser.page_source
if "whatever" in html_source:
    # do something
else:
    # do something else

6
Найкраща відповідь поки! Найбільш безпосередній і зрозумілий спосіб зробити це, набагато компактніший, ніж інший, досі діючий, альтернативний варіант ( find_element_by_xpath("//*").get_attribute("outerHTML")(
5agado

13
Що робити, якщо нам потрібно отримати джерело сторінки після виконання всіх javascript.?
Yogeesh Seralathan

4
Працює, лише якщо сторінка повністю завантажена. Якщо сторінка завантажується необмежено довго, це властивість не працює.
TheRookierLearner

5

За допомогою Selenium2Library ви можете використовувати get_source()

import Selenium2Library
s = Selenium2Library.Selenium2Library()
s.open_browser("localhost:7080", "firefox")
source = s.get_source()

7
Чи можу я встановити затримку та отримати останнє джерело? За допомогою javascript завантажується динамічний вміст.
CodeGuru

4

driver.page_source допоможе вам отримати вихідний код сторінки. Ви можете перевірити, чи є текст у джерелі сторінки чи ні.

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("some url")
if "your text here" in driver.page_source:
    print('Found it!')
else:
    print('Did not find it.')

Якщо ви хочете зберегти джерело сторінки у змінній, додайте нижче рядок після driver.get :

var_pgsource=driver.page_source

і змініть умову if на:

if "your text here" in var_pgsource:

1
Хоча цей код може відповісти на запитання, надання додаткового контексту щодо того, як та / або чому він вирішує проблему, покращило б довгострокову цінність відповіді.
Nic3500

2

Використовуючи джерело сторінки, ви отримаєте весь HTML-код.
Тож спочатку вирішіть блок коду або тегу, в якому вам потрібно отримати дані або клацнути елемент.

options = driver.find_elements_by_name_("XXX")
for option in options:
    if option.text == "XXXXXX":
        print(option.text)
        option.click()

Ви можете знайти елементи за іменем, XPath, ідентифікатором, посиланням та шляхом CSS.


1

Щоб відповісти на ваше запитання щодо отримання URL-адреси для urllib, просто запустіть цей код JavaScript:

url = browser.execute_script("return window.location;")

1

Ви можете просто використовувати WebDriverоб'єкт і отримати доступ до вихідного коду сторінки через його @propertyполе page_source...

Спробуйте цей фрагмент коду :-)

from selenium import webdriver
driver = webdriver.Firefox('path/to/executable')
driver.get('https://some-domain.com')
source = driver.page_source
if 'stuff' in source:
    print('found...')
else:
    print('not in source...')

чим ця відповідь відрізняється від stackoverflow.com/a/7866938/2231972 ?
Роман

1
from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Chrome()
html_source_code = driver.execute_script("return document.body.innerHTML;")
html_soup: BeautifulSoup = BeautifulSoup(html_source_code, 'html.parser')

Тепер ви можете застосувати функцію BeautifulSoup для вилучення даних ...


-6

Я рекомендую отримати джерело за допомогою urllib і, якщо ви збираєтеся робити синтаксичний аналіз, використовуйте щось на зразок Beautiful Soup .

import urllib

url = urllib.urlopen("http://example.com") # Open the URL.
content = url.readlines() # Read the source and save it to a variable.

Добре, тоді ти знаєш, як я можу отримати URL-адресу в межах Selenium? Я хочу зберегти URL-адресу у змінній, щоб я міг отримати доступ до неї за допомогою urllib.
user1008791

@ user1008791 Це має значення? Ви, мабуть, дозволяєте користувачеві все-таки ввести його, використовуючи raw_input, просто зробіть те саме, але за допомогою urllib.
Гріффін

Це було лише для простого прикладу, URL-адреса буде сильно змінюватися.
user1008791

8
Селен робить багато речей, які urllib не робить (наприклад, виконання JavaScript).
mpenkov

Використовувати urllib тут безглуздо, чому? У AutomatedTester це правильно, це те, що я роблю для сканування через джерело HTML, щоб переконатися, що ми не натискаємо на код середовища розробки.
Дейв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.