Python Selenium acessando código HTML

97

Como posso obter o código-fonte HTML em uma variável usando o módulo Selenium com Python?

Eu queria fazer algo assim:

from selenium import webdriver

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

Como posso fazer isso? Não sei como acessar o código-fonte HTML.

user1008791
fonte
2
Escreva a seguinte linha antes da condição if: html_source = browser.page_source
Abdul Majeed

Respostas:

191

Você precisa acessar a page_sourcepropriedade:

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
fonte
6
Melhor resposta até agora! A forma mais imediata e clara de o fazer, muito mais compacta que a outra, ainda válida, alternativa ( find_element_by_xpath("//*").get_attribute("outerHTML")(
5agado
13
E se precisarmos obter o código-fonte da página depois que todo o javascript for executado.?
Yogeesh Seralathan
4
Funciona apenas se a página estiver completamente carregada. Se a página carregar indefinidamente, essa propriedade não funciona.
TheRookierLearner
5

Com Selenium2Library você pode usar get_source()

import Selenium2Library
s = Selenium2Library.Selenium2Library()
s.open_browser("localhost:7080", "firefox")
source = s.get_source()
Milanka
fonte
7
Posso definir um atraso e obter a fonte mais recente? Existem conteúdos dinâmicos carregados usando javascript.
CodeGuru
4

driver.page_source o ajudará a obter o código-fonte da página. Você pode verificar se o texto está presente na fonte da página ou não.

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

Se você deseja armazenar o código-fonte da página em uma variável, adicione a linha abaixo após driver.get :

var_pgsource=driver.page_source

e altere a condição if para:

if "your text here" in var_pgsource:
Dhiraj
fonte
1
Embora este código possa responder à pergunta, fornecer contexto adicional sobre como e / ou por que ele resolve o problema melhoraria o valor da resposta a longo prazo.
Nic3500
2

Ao usar o código-fonte da página, você obterá todo o código HTML.
Portanto, primeiro decida o bloco de código ou tag em que você deseja recuperar os dados ou clicar no elemento.

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

Você pode encontrar os elementos por nome, XPath, id, link e caminho CSS.

Mahesh Reddy Atla
fonte
1

Para responder à sua pergunta sobre como obter o URL a ser usado para urllib, basta executar este código JavaScript:

url = browser.execute_script("return window.location;")
Bob Evans
fonte
1

Você pode simplesmente usar o WebDriverobjeto e acessar o código-fonte da página por meio de seu @propertycampopage_source ...

Experimente este snippet de código :-)

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
fonte
como essa resposta difere de 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')

Agora você pode aplicar a função BeautifulSoup para extrair dados ...

mobin alhassan
fonte
-6

Eu recomendo obter a fonte com urllib e, se você for analisar, use algo como 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.
Griffin
fonte
Ok, então você sabe como posso obter a URL no Selenium? Quero armazenar o URL em uma variável para poder acessá-lo com o urllib.
user1008791
@ user1008791 Isso importa? Você aparentemente está permitindo que o usuário digite de qualquer maneira usando raw_input, apenas faça o mesmo, mas com urllib.
Griffin,
Isso foi só para dar um exemplo fácil, a URL vai mudar muito.
user1008791
8
Selenium faz muitas coisas que o urllib não faz (por exemplo, execução de JavaScript).
mpenkov
Usar o urllib aqui não faz sentido, por quê? AutomatedTester está correto, é o que eu faço para escanear o código-fonte HTML para ter certeza de não enviar o código do ambiente de desenvolvimento.
Dave