BeautifulSoup не извлекает теги комметов на динамической странице - PullRequest
0 голосов
/ 21 ноября 2018

Что мне нужно: Подсчитать количество отзывов под расширением в Chrome Store на всех языках. Что я сделал: Пробовал BeautifulSoup для извлечения определенного тега.Я восстановил html-код страницы и нашел тег отзыва: enter image description here

Попробовал этот код:

    from bs4 import BeautifulSoup
    import requests
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html5lib')
    comments = soup.find_all('div', class_ = 'ba-bc-Xb ba-ua-zl-Xb')

Но print(comments) показывает, чтомассив пуст .
Я застрял на данный момент и вижу, что в дальнейшем мне нужно решить две проблемы :

  1. Каксправиться с выбранным языком?Как считать отзывы на всех языках, если по умолчанию выбран только один язык.selecting certain language

  2. Отзывы хранятся в разных вкладках.Я читал о динамически извлекать его, но не получил точку.

different tabs

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

попробуйте

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 
import time

driver = webdriver.Chrome()

driver.get('https://chrome.google.com/webstore/detail/evernote-web-clipper/pioclpoplcdbaefihamjohnefbikjilc?hl=en')
wait = WebDriverWait(driver, 5)
wait.until(EC.visibility_of_element_located((By.ID, ':21'))).click()
wait.until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, '.h-z-Ba-ca.ga-dd-Va.g-aa-ca'))
    ).click()

english = driver.find_element_by_xpath('//div[@class="ah-mg-j"]/span').text
print('English: ' + english.split()[-1])

wait.until(
        EC.visibility_of_element_located((By.XPATH, '//div[@class="g-aa-ca-ma-x-L" and text() = "All languages"]'))
    ).click()
wait.until_not(EC.text_to_be_present_in_element((By.XPATH, '//div[@class="ah-mg-j"]/span'), english))
time.sleep(2)

AllCount = driver.find_element_by_xpath('//div[@class="ah-mg-j"]/span').text
print('All languages: ' + AllCount.split()[-1])
driver.close()
0 голосов
/ 21 ноября 2018

Вы можете использовать селен для выполнения задач, ожидания изменений страницы и извлечения количества отзывов из PaginationMessage.Протестировано с несколькими ссылками.Возможно, вам придется добавить обработку ошибок для элементов без обзоров.Похоже, что некоторые действия POST XHR приводят к проверке строк JSON, которые вы, возможно, захотите изучить.

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

url = 'https://chrome.google.com/webstore/detail/evernote-web-clipper/pioclpoplcdbaefihamjohnefbikjilc?hl=en/'
#url = 'https://chrome.google.com/webstore/detail/https-everywhere/gcbommkclmclpchllfjekcdonpmejbdp?hl=en/'
d = webdriver.Chrome()
d.get(url)
WebDriverWait(d, 5).until(EC.visibility_of_element_located((By.ID, ':21'))).click()
ActionChains(d).click_and_hold(WebDriverWait(d, 5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.h-z-Ba-ca.ga-dd-Va.g-aa-ca')))).perform()
languageSelection = WebDriverWait(d, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, '.g-aa-ca-ma-x-L')))
languageSelection[1].click()

s= WebDriverWait(d, 5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.Aa.dc-tf + span'))).text
print(s.split()[-1])
d.quit()
...