Python Selenium: доступ к информации на этикетке арии - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь прочитать отзывы, связанные с приложением, присутствующим в магазине Google Play. Я использую Selenium для этой цели. Каждый отзыв присутствует в jscontroller = "H6e0Ge".

enter image description here

Внутри тега jscontroller = "H6e0Ge" я пытаюсь получить оценку, присвоенную пользователем, ассоциированную с меткой aria, как показано на рисунке.

enter image description here

Чтобы прочитать рейтинг всех рецензентов, мой код:

driver = webdriver.Chrome('/Users/yasirmuhammad/Downloads/chromedriver')
driver.get('https://play.google.com/store/apps/details?id=com.axis.drawingdesk.v3&hl=en&showAllReviews=true')
for a in driver.find_elements_by_xpath("//*[@class='d15Mdf bAhLNe']"):
    print(a.find_element_by_class_name('X43Kjb').text)
    print(a.find_element_by_class_name('p2TkOb').text)
    print(a.find_element_by_xpath('/html/body/div[1]/div[4]/c-wiz/div/div[2]/div/div[1]/div/div/div[1]/div[2]/div/div[2]/div/div[2]/div[1]/div[1]/div/span[1]/div/div').get_attribute('aria-label'))

Третье утверждение печати гласит: рейтинг, но проблема в том, что он остается одинаковым для всех пользователей. Причина в том, что я скопировал полный xpath рейтинга первого пользователя, следовательно, он показывает тот же рейтинг для других пользователей. Поэтому я заменяю третье утверждение следующим:

print(a.find_element_by_class_name('pf5lIe').get_attribute('aria-label'))

Однако, это утверждение возвращает "Нет". Кто-нибудь может подсказать мне, как мне прочитать информацию, связанную с «aria-label»?

Ответы [ 3 ]

1 голос
/ 23 января 2020

Вы не можете использовать H6e0Ge и html/body/div[1]/div[4]/c-wiz/div/div[2]/div/div[1]/div/div/div[1]/div[2]/div/div[2]/div/div[2]/div[1]/div[1]/div/span[1]/div/div как локаторы, потому что они динамически изменяют и не будут работать очень скоро.

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

reviews = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//h3[.='User reviews']/following-sibling::div[1]/div")))
for review in reviews:
    print(review.find_element_by_xpath(".//span[1]").text)
    print(review.find_element_by_xpath(".//span[2]").text)
    print(review.find_element_by_xpath(".//div[@role='img']").get_attribute('aria-label'))
    print(review.find_element_by_xpath("descendant::div[@jscontroller][last()])").text)

Xpaths:

//h3[.='User reviews']/following-sibling::div[1]/div//span[1]
//h3[.='User reviews']/following-sibling::div[1]/div//span[2]
//h3[.='User reviews']/following-sibling::div[1]//div[@role='img']
//h3[.='User reviews']/following-sibling::div[1]/div/descendant::div[@jscontroller][last()]
0 голосов
/ 23 января 2020

Чтобы прочитать рейтинг всех рецензентов, вам нужно вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете использовать следующие Стратегии локатора :

  • Использование XPATH:

    driver.get('https://play.google.com/store/apps/details?id=com.axis.drawingdesk.v3&hl=en&showAllReviews=true')
    print([my_elem.get_attribute("aria-label") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//h3[text()='User reviews']//following::div[1]//span[text()]//following::div[1]//div[@role='img']")))])
    
  • Консольный вывод:

    ['Rated 4 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 1 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 4 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 4 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 4 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars', 'Rated 5 stars out of five stars']
    
  • Примечание : у вас есть добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 23 января 2020

Вы пытаетесь прочитать атрибут родительского тега <div>, но его там нет. Вам нужно исправить свой код следующим образом:

print(a.find_element_by_xpah('.//div[@jscontroller and @jsmodel and @jsdata]//span[@class='nt2C1d']//div[@aria-label]').get_attribute('aria-label'))
...