Python Selenium uzyskuje dostęp do źródła HTML

98

Jak mogę pobrać źródło HTML w zmiennej za pomocą modułu Selenium w Pythonie?

Chciałem zrobić coś takiego:

from selenium import webdriver

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

Jak mogę to zrobić? Nie wiem, jak uzyskać dostęp do źródła HTML.

user1008791
źródło
2
Napisz następującą linię przed if condition: html_source = browser.page_source
Abdul Majeed

Odpowiedzi:

194

Musisz uzyskać dostęp do page_sourcenieruchomości:

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
AutomatedTester
źródło
6
Jak dotąd najlepsza odpowiedź! Najbardziej bezpośredni i przejrzysty sposób, aby to zrobić, znacznie bardziej zwarty niż inny, wciąż aktualny, alternatywny find_element_by_xpath("//*").get_attribute("outerHTML")(
5agado
14
A co, jeśli po wykonaniu wszystkich skryptów javascript będziemy potrzebować źródła strony?
Yogeesh Seralathan
4
Działa tylko wtedy, gdy strona została całkowicie załadowana. Jeśli strona ładuje się w nieskończoność, ta właściwość nie działa.
TheRookierLearner
5

Z Selenium2Library możesz używać get_source()

import Selenium2Library
s = Selenium2Library.Selenium2Library()
s.open_browser("localhost:7080", "firefox")
source = s.get_source()
Milanka
źródło
7
Czy mogę ustawić opóźnienie i uzyskać najnowsze źródło? Istnieją dynamiczne treści ładowane za pomocą javascript.
CodeGuru,
4

driver.page_source pomoże Ci uzyskać kod źródłowy strony. Możesz sprawdzić, czy tekst jest obecny w źródle strony, czy nie.

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.')

Jeśli chcesz przechowywać źródło strony w zmiennej, dodaj poniższy wiersz po driver.get :

var_pgsource=driver.page_source

i zmień warunek if na:

if "your text here" in var_pgsource:
Dhiraj
źródło
1
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Nic3500
2

Korzystając ze źródła strony, otrzymasz cały kod HTML.
Więc najpierw zdecyduj, w którym bloku kodu lub tagu chcesz pobrać dane lub kliknąć element.

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

Możesz znaleźć elementy według nazwy, XPath, id, linku i ścieżki CSS.

Mahesh Reddy Atla
źródło
1

Aby odpowiedzieć na pytanie dotyczące uzyskania adresu URL do użycia dla urllib, po prostu wykonaj następujący kod JavaScript:

url = browser.execute_script("return window.location;")
Bob Evans
źródło
1

Możesz po prostu użyć WebDriverobiektu i uzyskać dostęp do kodu źródłowego strony za pośrednictwem jego @propertypolapage_source ...

Wypróbuj ten fragment kodu :-)

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...')
SysMurff
źródło
czym różni się ta odpowiedź od stackoverflow.com/a/7866938/2231972 ?
Roman Konoval
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')

Teraz możesz zastosować funkcję BeautifulSoup, aby wyodrębnić dane ...

mobin a lhassan
źródło
-6

Poleciłbym uzyskać źródło za pomocą urllib i, jeśli masz zamiar analizować, użyj czegoś takiego jak 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.
Gryf
źródło
W porządku, czy wiesz, jak mogę uzyskać adres URL w Selenium? Chcę przechowywać adres URL w zmiennej, aby uzyskać do niego dostęp za pomocą urllib.
user1008791
@ user1008791 Czy to ma znaczenie? Najwyraźniej i tak pozwalasz użytkownikowi wpisać go przy użyciu raw_input, po prostu zrób to samo, ale z urllib.
Griffin
To był tylko prosty przykład, adres URL będzie się bardzo zmieniał.
user1008791
8
Selenium robi wiele rzeczy, których urllib nie robi (np. Wykonywanie JavaScript).
mpenkov
Używanie tu urllib jest bezcelowe, dlaczego? AutomatedTester ma rację, to jest to, co robię, aby skanować przez kod HTML, aby upewnić się, że nie wysyłamy kodu środowiska programistycznego.
Dave,