【问题标题】:BeautifulSoup does not extract commet tags in dynamic pageBeautifulSoup 不会在动态页面中提取评论标签
【发布时间】:2019-04-23 18:43:39
【问题描述】:

我需要什么:统计所有语言的 Chrome 商店 中扩展程序下的评论数量。 我做了什么: 尝试用 BeautifulSoup 提取某个标签。我重新搜索了页面的 html-code 并找到了一个评论标签:

试过这段代码:

    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. 如何应对选择语言按钮?如果默认情况下仅选择一种语言,如何计算 所有 种语言的评论。

  2. 评论存储在不同的选项卡中。我读到了动态提取它,但没有得到一点。

【问题讨论】:

标签: python selenium-webdriver web-scraping beautifulsoup


【解决方案1】:

您可以使用 selenium 执行任务并等待页面更改并从 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()

【讨论】:

  • 感谢您的回答。结果是 110 等于俄语第一个选项卡上的评论数,我需要计算所有语言的评论总数。
  • 168。这仍然不是总数。但我很感激你的工作。执行脚本时,我会看到 Chrome 浏览器如何实时工作(它会自行打开和翻页),但如果选项卡的数量很大 - 这意味着我需要等待很多时间 webdriver 才能提取它.
  • 我很困惑。如果我使用您的链接并转到评论选项卡并选择所有语言,我会看到 168 作为评论数量。预期的数字是多少?
  • 这个数字要大得多。如果您不断按“下一步”,您会看到数字越来越高。
【解决方案2】:

试试这个

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()

【讨论】:

  • 感谢您的帮助。它返回:English: 128 All languages: 168这不是所有选项卡上的总数
猜你喜欢
  • 2018-02-28
  • 2014-03-25
  • 1970-01-01
  • 2011-08-29
  • 2015-12-23
  • 2019-03-22
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多