簡體   English   中英

如何在 Python 中使用 Selenium 從網頁中獲取數據?

[英]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')告訴seleniumHTML節點中搜索包含“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM