Есть ли способ получить определенный текст из селектора CSS? - PullRequest
1 голос
/ 11 июля 2019

Я собираюсь захватить всю часть #text селектора css при проверке элемента.Я, кажется, собираю все цифры под моим селектором вместо текстовой части.

Ссылка, которую я собираю, - https://www.virginmobile.ca/en/phones/phone-details.html#!/gs9/Grey/64/TR20.

Я хотел бы получить цены в разделе "выберите свойцена телефона ', но без' $ 'и' 99 'центов в конце строки

В настоящее время я знаком только с захватом всей строки.

    driver.get(link)
    time.sleep(3)
    print('---------------------------  begining ------------------')

    planTypeUpfrontCostListRaw = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#phonePricesList .ultra')))

    for element in planTypeUpfrontCostListRaw:
        upfrontCost = element.text
        print(upfrontCost)

    print('---------------------------  END  ------------------------')

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Раствор 1
Вместо использования text используйте innerHTML. Это вернет вам HTML-код этого элемента, включая текст!

Например, он вернет вам:

"<sup>$</sup>199<sup>99</sup>"

Затем вы можете использовать библиотеку регулярных выражений re, чтобы получить значение только в середине.

print(re.search('\d+', upfrontCost).group(0))

Выход: 199

Вот код для этого:

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

link = "https://www.virginmobile.ca/en/phones/phone-details.html#!/gs9/Grey/64/TR20"
driver = Chrome()
wait = WebDriverWait(driver, 15)
driver.get(link)
print('---------------------------  begining ------------------')

planTypeUpfrontCostListRaw = wait.until \
    (EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.price.ultra.ng-binding.ng-scope')))

for element in planTypeUpfrontCostListRaw:
     upfrontCost = element.get_attribute('innerHTML')
     upfrontCost = re.search('\d+', upfrontCost).group(0)
     print(upfrontCost)
print('---------------------------  END  ------------------------')

Выход:

---------------------------  begining ------------------
0
0
199
349
739
1019
---------------------------  END  ------------------------

Solution2
Вы все еще можете использовать text и удалить ненужные данные, используя strip для $ и удалить последние две цифры.

driver = Chrome()
wait = WebDriverWait(driver, 15)
driver.get(link)
print('---------------------------  begining ------------------')

planTypeUpfrontCostListRaw = wait.until \
    (EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.price.ultra.ng-binding.ng-scope')))

for element in planTypeUpfrontCostListRaw:
     upfrontCost = element.text.strip('$')
     if upfrontCost != '0':
         upfrontCost = upfrontCost[:-2]
     print(upfrontCost)
print('---------------------------  END  ------------------------')
0 голосов
/ 11 июля 2019

Вы можете сделать дамп в bs4 и использовать stripped_strings

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

d = webdriver.Chrome(r'C:\Users\User\Documents\chromedriver.exe')
d.get('https://www.virginmobile.ca/en/phones/phone-details.html?province=ON&geoResult=failed#!/gs9/Grey/64/TR20')
WebDriverWait(d,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "planlevels .price")))
soup = bs(d.page_source, 'lxml')
plans = soup.select('planlevels .price')

for plan in plans:
    price = [string for string in plan.stripped_strings][1]
    print(price)

Более уродливым, IMO, может быть использование split и отсутствие BS4

plans = WebDriverWait(d,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "planlevels .price")))
for plan in plans:
    print(plan.get_attribute('innerHTML').split('</sup>')[1].split('<sup>')[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...