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.


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

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()

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:

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.


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;")

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

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


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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.