簡體   English   中英

如何使用 Selenium 和 Python 從 span 標簽內的文本節點中提取文本 121.6

[英]How to extract the text 121.6 from the text node within the span tag using Selenium and Python

對於 web 上的以下元素

<span title="點贊數14332" class="like"><!----><!----><!----><!----><!----><i class="van-icon-videodetails_like" style="color:;"></i>1.4萬
    </span>
<span title="number" class="like">
   <!---->
   <!---->
   <!---->
   <!---->
   <!---->
   <i class="van-icon-videodetails_like" style="color:;"></i>
"121.6"
</span>

我想得到的是數字“121.6”。 我試過了,

likes = driver.find_elements_by_xpath('//span[@class="like"]')[0].text

它返回我“--”,沒有別的。

我還嘗試從檢查中復制 X 路徑,

likes = driver.find_elements_by_xpath('//*[@id="arc_toolbar_report"]/div[1]/span[1]/text()')

但是 selenium 返回我:

selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: The result of the xpath expression "//*[@id="arc_toolbar_report"]/div[1]/span[1]/text()" is: [object Text]. It should be an element.

我應該怎么做才能獲得數字“121.6”?

要提取視頻上的點數,即當前文本為1.5 萬,因為文本位於文本節點內,您需要為visibility_of_element_located()execute_script()方法引入WebDriverWait ,您可以使用以下任一定位器策略

  • 使用XPATH

     print(driver.execute_script('return arguments[0].lastChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[@class='like' and starts-with(@title, '點贊數')][not(contains(.,'--'))]")))).strip())
  • 使用CSS_SELECTOR

     print(driver.execute_script('return arguments[0].lastChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.like[title^='點贊數']")))).strip())
  • 注意:您必須添加以下導入:

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

參考

您可以在以下位置找到一些相關的討論:

我已經測試了您提供的 xpath 以及您與bilibili.com的鏈接,並且能夠獲得該視頻的點贊數。 正如DebanjanB 的回答中已經提到的,您將不得不使用WebDriverWait

您的代碼返回“--”,因為喜歡的數量仍在后台動態加載。 您將在下面找到一個等待“--”被實際數字替換的代碼片段

WebDriverWait(driver, 120).until(
    EC.visibility_of_element_located((By.XPATH,'/html/body/div[3]/div/div[1]/div[3]/div[1]/span[1] \
    [not(contains(text(),"--"))]')
))

likes = driver.find_element_by_xpath("/html/body/div[3]/div/div[1]/div[3]/div[1]/span[1]").text
print(likes)

返回 1.4 萬

[不(包含(文本(),“--”))]

基本上告訴驅動程序等到所選節點不包含'--'字符串。

編輯:

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

這些是您需要的進口商品。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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