Mendapatkan nilai teks dari tag HTML melalui Selenium Web Automation dengan Python?

Saya membuat bot reddit yang akan mencari atribut tertentu di komentar, menggunakan Selenium untuk mengunjungi situs informasi, dan menggunakan driver.find_element_by... untuk mendapatkan nilai di dalam tag itu, tetapi tidak berfungsi.

Saat saya menggunakan driver.find_element_by_class_name(), inilah data yang dikembalikan:

<selenium.webdriver.remote.webelement.WebElement (session="f454dcf92728b9db4de080a27a844bf7", element="514bd57d-99d7-4fce-a05d-3fa92f66ad49")>

ketika saya menggunakan driver.find_elements_by_css_selector(".style-scope.ytd-video-renderer"), ini dikembalikan:

[
  <selenium.webdriver.remote.webelement.WebElement (session="43cb953cde81df270260bf769fe081a2", element="6b4ee3e2-5e6b-48e2-8ec8-9083bf15baea")>, 
  <selenium.webdriver.remote.webelement.WebElement (session="43cb953cde81df270260bf769fe081a2", ...
]

ketika saya menggunakan driver.find_elements_by_css_selector(".style-scope.ytd-video-renderer").

Misalkan inilah yang saya coba temukan (Kode di atas mengembalikan data Selenium di atas untuk tag ini):

<yt-formatted-string class="style-scope ytd-video-renderer" aria-label="Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』 by Melodic Star 2 months ago 4 minutes, 18 seconds 837,676 views">Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』</yt-formatted-string>

Apa yang saya inginkan

Saya ingin Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』 dikembalikan.

Apa yang dapat saya lakukan?


person KazutoKiritoKirigaya    schedule 26.09.2020    source sumber


Jawaban (2)


Sepertinya kalian cukup dekat. Saat Anda menggunakan driver.find_element_by_class_name() WebElement pertama yang cocok dikembalikan. Saat mencetak yang sama, hasilnya adalah:

<selenium.webdriver.remote.webelement.WebElement (session="f454dcf92728b9db4de080a27a844bf7", element="514bd57d-99d7-4fce-a05d-3fa92f66ad49")>

yang mewakili WebElement itu sendiri, yang mungkin berisi teks yang diinginkan.

Pada baris serupa driver.find_elements_by_css_selector(".style-scope.ytd-video-renderer") mengembalikan daftar WebElements yang cocok dan saat mencetaknya, outputnya adalah:

[
  <selenium.webdriver.remote.webelement.WebElement (session="43cb953cde81df270260bf769fe081a2", element="6b4ee3e2-5e6b-48e2-8ec8-9083bf15baea")>, 
  <selenium.webdriver.remote.webelement.WebElement (session="43cb953cde81df270260bf769fe081a2",
  ...
]

Larutan

Untuk mengekstrak teks Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』 dari HTML berikut:

<yt-formatted-string class="style-scope ytd-video-renderer" aria-label="Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』 by Melodic Star 2 months ago 4 minutes, 18 seconds 837,676 views">Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』</yt-formatted-string>

Anda dapat menggunakan salah satu dari Strategi Pencari Lokasi berikut:

  • Menggunakan css_selector dan get_attribute():

    print(driver.find_element_by_css_selector("yt-formatted-string.style-scope.ytd-video-renderer").get_attribute("innerHTML"))
    
  • Menggunakan atribut xpath dan teks:

    print(driver.find_element_by_xpath("//yt-formatted-string[@class='style-scope ytd-video-renderer']").text)
    

Idealnya, untuk mencetak teks 3,862.76 Anda harus menginduksi WebDriverWait untuk visibility_of_element_located() dan Anda dapat menggunakan salah satu dari Strategi Pencari Lokasi:

  • Menggunakan CSS_SELECTOR dan get_attribute():

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "yt-formatted-string.style-scope.ytd-video-renderer"))).get_attribute("innerHTML"))
    
  • Menggunakan atribut XPATH dan teks:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//yt-formatted-string[@class='style-scope ytd-video-renderer']"))).text)
    
  • Catatan : Anda harus menambahkan impor berikut :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Anda dapat menemukan diskusi yang relevan di Cara mengambil teks WebElement menggunakan Selenium - Python


luar

Tautan ke dokumentasi yang berguna:

person DebanjanB    schedule 26.09.2020
comment
Terima kasih, hanya ingin Anda memikirkannya lebih jauh - misalkan saya memiliki beberapa <span class="tags"> Lorem Ipsum </>, dan saya menggunakan driver.find_elements_by... alih-alih driver.find_element_by..., apakah teks akan dikembalikan sebagai satu string panjang atau akankah ada baris baru untuk setiap atribut ( Saya menyimpan data ini dan membalas komentar Reddit melalui PRAW, jadi jika saya menggunakan comment.reply("tags: {}".format(tags)), apakah semua tag akan disatukan dalam satu string tanpa spasi atau akankah diberi spasi di antara setiap tag? - person KazutoKiritoKirigaya; 26.09.2020
comment
@KazutoKiritoKirigaya driver.find_elements akan selalu mengembalikan daftar. Anda harus mengulangi daftar untuk mengekstrak teks. - person DebanjanB; 26.09.2020
comment
Masalahnya, dikatakan bahwa driver.find_elements_by... tidak dapat diubah. - person KazutoKiritoKirigaya; 26.09.2020
comment
@KazutoKiritoKirigaya Benar, tapi kami juga bisa menawarkan solusi optimal :) Jangan ragu untuk mengajukan pertanyaan baru sesuai kebutuhan baru Anda. Kontributor StackOverflow akan dengan senang hati membantu Anda. - person DebanjanB; 26.09.2020
comment
Apakah tidak ada solusi alternatif yang jelas untuk masalah ini sehingga saya dapat mengekstrak teks dari driver.find_elements_by...? - person KazutoKiritoKirigaya; 26.09.2020
comment
@KazutoKiritoKirigaya Ada solusi untuk itu juga. Namun karena konteksnya berbeda, saya menyarankan Anda untuk mengajukan pertanyaan baru sehingga pertanyaan ini dan pertanyaan baru bermanfaat bagi pembaca di masa mendatang. - person DebanjanB; 26.09.2020
comment
Selesai, semoga Anda menjawab di sana! Menemukan jawaban Anda untuk ini cukup membantu. - person KazutoKiritoKirigaya; 26.09.2020

Gunakan .text:

element = driver.find_element_by_xpath('//*[@id="container"]/h1/yt-formatted-string')
print(element.text)
person Stroe Andrei    schedule 26.09.2020