[英]How to get data from a web-page using Selenium in Python?
我需要使用 Selenium 從頁面中提取一些信息,這些元素不在頁面的代碼中(似乎是 JavaScript)。 這就是我正在做的:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
path = '...'
URL = '...'
driver = webdriver.Chrome(executable_path=path) # successfully connecting to
# Chrome
driver.get(URL) # following the link
NB
這是我需要的元素示例:
<span class="wrapper__top_3ztMC">
Машинное зрение DA
</span>
我在這里有一些問題。
問題#1。 為什么這些不起作用:
1)
result = driver.find_element_by_class_name('wrapper__top_3ztMC')
result = driver.find_element(By.XPATH, "//span[@class='wrapper__top_3ztMC']")
result = driver.find_element_by_xpath('//span[@class="wrapper__top_3ztMC"]')
3種情況下相同的錯誤:
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//span[@class='wrapper__top_3ztMC']"}
(Session info: chrome=86.0.4240.75)
問題2。 為什么這不起作用:
result = driver.execute_script("return document.getElementsByClassName('wrapper__top_3ztMC')")
result
返回一個空列表 []。
但!
這個:
element = WebDriverWait(driver, 50).until(
EC.presence_of_element_located((By.CLASS_NAME, "wrapper__top_3ztMC"))
)
返回第一個元素(因為我使用的是“直到”)。 最終:看起來前 3 種方式不起作用,因為數據需要一些時間才能在頁面上顯示,並且頁面本身的加載時間必須比代碼工作的時間長一些。
主要問題。
我如何做到不輸出第一個元素,而是輸出所有類滿足指定元素的元素? 順便說一下,另一個問題是頁面很長,為了讓其他元素也能顯示出來,你需要滾動到最后——這也需要考慮。 謝謝。
“我如何做到不輸出第一個元素,而是輸出所有符合指定類的元素?” 對於這個問題,答案是您可以使用driver.find_elements_by_xpath
而不是driver.find_element_by_xpath
。
要滾動到頁面末尾,您可以使用以下代碼:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
所以,對於你的HTML
代碼
<span class="wrapper__top_3ztMC">
Машинное зрение DA
</span>
您需要獲取span
的父元素才能顯示span
的文本
例如,假設您的span
的父級是div
。 因此,為了獲取span
的文本,您需要使用以下xpath
# xpath to locate span's parent element
//div//span[contains(., 'wrapper__top_3ztMC')]/..
# use xpath to get the text of the span
myText = driver.find_element(By.XPATH, "//div//span[contains(., 'wrapper__top_3ztMC')]/..").text
print(f'Span Text is: {myText}')
這個xpath
作用是在瀏覽器的DOM
定位span
元素,然后遍歷/向上移動 1 級到父節點。 轉到span
的父節點將允許您訪問span
內的文本。 如果您的span
是一個按鈕,那么您也可以使用xpath
來單擊該元素。
driver.find_element(By.XPATH, "//div//span[contains(., 'wrapper__top_3ztMC')]/..").click()
主鍵在
//span[contains(., 'wrapper__top_3ztMC')]
contains(., 'Whatever')
告訴selenium
在HTML
節點中搜索包含“wrapper__top_3ztMC”文本的任何內容。 這是一種能夠找到span
元素的方法。 但是,為了與span
元素交互,您需要使用xpath
末尾的/..
轉到父節點。
滾動到元素答案
使用xpath
找到元素后
//div//span[contains(., 'wrapper__top_3ztMC')]/..
您可以使用JavaScript
滾動到元素
element = driver.find_element(By.XPATH, "//div//span[contains(., 'wrapper__top_3ztMC')]/..")
driver.execute_script("return arguments[0].scrollIntoView();", element)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.