Как извлечь текст 121.6 из текстового узла в теге span с помощью Selenium и Python - PullRequest
0 голосов
/ 28 мая 2020

Для следующего элемента в сети

<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.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»?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Я проверил предоставленный вами 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 万

[not (contains (text (), «-»))]

в основном указывает драйверу подождать, пока выбранный узел не будет содержать строку '-'.

EDIT:

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

Это импорт, который вам понадобится.

0 голосов
/ 28 мая 2020

Чтобы извлечь количество лайков на видео, то есть текущий текст как 1,5 万 , поскольку текст находится внутри Текстового узла , вам необходимо вызвать WebDriverWait для методов visibility_of_element_located() и execute_script(), и вы можете использовать любую из следующих стратегий поиска :

  • Использование 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
    

Ссылка

Вы можете найти пару соответствующих обсуждений в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...