Python Selenium เข้าถึงซอร์ส HTML


99

ฉันจะรับซอร์สHTMLในตัวแปรโดยใช้โมดูลซีลีเนียมกับ 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
เขียนบรรทัดต่อไปนี้ก่อน if condition: html_source = browser.page_source
Abdul Majeed

คำตอบ:


195

คุณต้องเข้าถึง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

15
จะเกิดอะไรขึ้นถ้าเราต้องการรับแหล่งที่มาของหน้าหลังจากที่จาวาสคริปต์ดำเนินการทั้งหมด
Yogeesh Seralathan

4
ใช้งานได้เฉพาะในกรณีที่หน้าเว็บโหลดเสร็จสมบูรณ์ หากหน้าเว็บโหลดไปเรื่อย ๆ คุณสมบัตินี้จะไม่ทำงาน
TheRookierLearner

5

ด้วย Selenium2Library คุณสามารถใช้ได้ get_source()

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

8
ฉันสามารถตั้งค่าการหน่วงเวลาและรับแหล่งข้อมูลล่าสุดได้หรือไม่ มีเนื้อหาแบบไดนามิกที่โหลดโดยใช้จาวาสคริปต์
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, id, link และ CSS path


2
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 เพื่อดึงข้อมูล ...


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อย่างไร
Roman Konoval

-6

ผมอยากแนะนำให้ได้รับมากับurllibและถ้าคุณกำลังจะแยกการใช้งานบางอย่างเช่นสวยซุป

import urllib

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

เอาล่ะคุณรู้หรือไม่ว่าฉันจะรับ URL ภายในซีลีเนียมได้อย่างไร ฉันต้องการเก็บ URL ไว้ในตัวแปรเพื่อให้ฉันสามารถเข้าถึงได้ด้วย urllib
user1008791

@ user1008791 ไม่เป็นไร เห็นได้ชัดว่าคุณกำลังให้ผู้ใช้พิมพ์โดยใช้ raw_input อยู่แล้วให้ทำเช่นเดียวกัน แต่ใช้ urllib
Griffin

นั่นเป็นเพียงตัวอย่างง่ายๆเท่านั้น URL จะมีการเปลี่ยนแปลงอย่างมาก
user1008791

8
ซีลีเนียมทำหลายสิ่งที่ urllib ไม่ทำ (เช่นการเรียกใช้ JavaScript)
mpenkov

การใช้ urllib ที่นี่ไม่มีจุดหมายทำไม? AutomatedTester ถูกต้องฉันทำเพื่อสแกนผ่านซอร์ส HTML เพื่อให้แน่ใจว่าเราไม่ผลักดันโค้ดสภาพแวดล้อมการพัฒนา
Dave
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.