Python Selenium truy cập nguồn HTML


97

Làm cách nào để lấy nguồn HTML trong một biến bằng cách sử dụng mô-đun Selenium với Python?

Tôi muốn làm một cái gì đó như thế này:

from selenium import webdriver

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

Tôi có thể làm cái này như thế nào? Tôi không biết cách truy cập vào nguồn HTML.


2
Viết dòng sau đây trước nếu tình trạng: html_source = browser.page_source
Abdul Majeed

Câu trả lời:


191

Bạn cần truy cập thuộc page_sourcetính:

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
Câu trả lời hay nhất cho đến nay! Cách trực tiếp và rõ ràng nhất để làm điều này, nhiều hơn nữa nhỏ gọn mà người kia, vẫn còn hiệu lực, thay thế ( find_element_by_xpath("//*").get_attribute("outerHTML")(
5agado

13
Điều gì sẽ xảy ra nếu chúng ta cần lấy nguồn trang sau khi tất cả các javascript thực thi.?
Yogeesh Seralathan

4
Chỉ hoạt động nếu trang đã tải xong. Nếu trang tải vô thời hạn thì thuộc tính này không hoạt động.
TheRookierLearner

5

Với Selenium2Library, bạn có thể sử dụng get_source()

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

7
Tôi có thể đặt thời gian trễ và lấy nguồn mới nhất không? Có nội dung động được tải bằng javascript.
CodeGuru

4

driver.page_source sẽ giúp bạn lấy mã nguồn của trang. Bạn có thể kiểm tra xem văn bản có trong nguồn trang hay không.

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

Nếu bạn muốn lưu trữ nguồn trang trong một biến, hãy thêm dòng bên dưới sau driver.get :

var_pgsource=driver.page_source

và thay đổi điều kiện if thành:

if "your text here" in var_pgsource:

1
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh về cách và / hoặc lý do tại sao nó giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Nic3500,

2

Bằng cách sử dụng nguồn trang, bạn sẽ nhận được toàn bộ mã HTML.
Vì vậy, trước tiên hãy quyết định khối mã hoặc thẻ mà bạn yêu cầu để truy xuất dữ liệu hoặc nhấp vào phần tử ..

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

Bạn có thể tìm thấy các phần tử theo tên, XPath, id, liên kết và đường dẫn CSS.


1

Để trả lời câu hỏi của bạn về việc lấy URL để sử dụng cho urllib, chỉ cần thực thi mã JavaScript này:

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

1

Bạn có thể chỉ cần sử dụng WebDriverđối tượng và truy cập vào mã nguồn của trang thông qua @propertytrường của nó page_source...

Hãy thử đoạn mã này :-)

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

câu trả lời này khác với stackoverflow.com/a/7866938/2231972 như thế nào?
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')

Bây giờ bạn có thể áp dụng chức năng BeautifulSoup để trích xuất dữ liệu ...


-6

Tôi khuyên bạn nên lấy nguồn bằng urllib và nếu bạn định phân tích cú pháp, hãy sử dụng cái gì đó như 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.

Được rồi, bạn có biết làm cách nào tôi có thể lấy URL trong Selenium không? Tôi muốn lưu trữ URL trong một biến để tôi có thể truy cập nó bằng urllib.
user1008791

@ user1008791 Có vấn đề gì không? Dường như bạn đang cho phép người dùng nhập nó bằng cách sử dụng raw_input, chỉ cần làm như vậy nhưng với urllib.
Griffin

Đó chỉ là để làm một ví dụ dễ hiểu, URL sẽ thay đổi rất nhiều.
user1008791

8
Selenium thực hiện nhiều thứ mà urllib không làm được (ví dụ: thực thi JavaScript).
mpenkov

Sử dụng urllib ở đây là vô nghĩa, tại sao? AutomatedTester đã đúng, đó là những gì tôi làm để quét qua mã nguồn HTML để đảm bảo rằng chúng tôi không đẩy mã môi trường phát triển.
Dave
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.