Как очистить определенный контент с помощью Beautifulsoup / Selenium - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь собрать количество лайков в каждом комментарии на YouTube.

Мой общий код перебирает / прокручивает вниз, но для простоты я показываю только ту часть, которая вызывает у меня проблемы.Я новичок в веб-соскоб.Вот что я пробовал:

page_url="https://www.youtube.com/watch?v=TQG7m1BFeRc"
driver = webdriver.Chrome('C:/Users/Me/Chrome Web 
Driver/chromedriver.exe')
driver.get(page_url)
html_source = driver.page_source
html = driver.find_element_by_tag_name('html')
soup=bs(html.text,'html.parser')
soup_source=bs(html_source,'html.parser')

Затем я пытаюсь извлечь количество лайков:

for div in soup.find_all('div', class_="style-scope ytd-comment-action- 
buttons-renderer"):
    a=str(div.text)
    print(a)

Но это ничего не возвращает.Когда я проверяю содержимое sou_source, я вижу следующее, где хранится информация, которую я хочу удалить:

<span aria-label="473 likes" class="style-scope ytd-comment-action- 
buttons-renderer" hidden="" id="vote-count-left">
    473

и т. Д.

Я пробовал несколько вещей, таких как:

html = driver.(By.ID, 'vote-count-left')

но это не работает.Если кто-то может помочь, это будет высоко ценится.Спасибо

Ответы [ 3 ]

1 голос
/ 24 марта 2019

Это будет работать:

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

from bs4 import BeautifulSoup

driver_path = r'C:/Users/Me/Chrome Web Driver/chromedriver.exe'
driver_path = r'D:\Programming\utilities\chromedriver.exe'

page_url = "https://www.youtube.com/watch?v=TQG7m1BFeRc"
driver = webdriver.Chrome(driver_path)
driver.get(page_url)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="owner-name"]/a')))
driver.execute_script('window.scrollTo(0, 768);')
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'vote-count-left')))

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
result = [element.text.strip() for element in soup.find_all('span', {'id': 'vote-count-left'})]

result

Выход:

['1.9K', '153', '36', '340', '474', '1.5K', '296', '750', '0', '18', '2K', '20', '17', '8', '192', '459', '56', '10', '0', '19']

Это на самом деле более сложно, чем казалось на первый взгляд, потому что YouTube не загружает раздел комментариев до тех пор, пока вы фактически не прокрутите вниз. Поэтому мне пришлось включить логику, чтобы дождаться полной загрузки страницы и прокрутить вниз, а затем подождать, пока комментарии не загрузятся.

Кроме того, вы должны были искать span, а не div - это было причиной того, что ваш исходный запрос ничего не нашел.

0 голосов
/ 24 марта 2019

Как насчет этого:

html = """
  <span id="vote-count-left" class="style-scope ytd-comment-action-buttons-renderer" aria-label="474 likes" hidden="">
    474
  </span>

  """
soup = BeautifulSoup(html, "lxml")
data = soup.find_all("span")
for i in data:
     print(i.text)

Вывод:

    474
0 голосов
/ 24 марта 2019

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

Примечание. Этот код не был протестирован, но имеет четкий путь к тому, чего вы пытаетесь достичь.

    import re
    reg = re.compile(r'(?<=[0-9]\s[A-Z]\s)[0-9\-\s]+')

    likeArray = driver.find_element_by_xpath('//*[@id="vote-count-middle"]')
    for row in likeArray:
    # Extract from span the value 000 Likes on internal html attribute
    value = row.get_attribute("aria-label").text
    if reg.search(value):
       # Remove text (Likes text)
       result = reg.search(value)
       # Print result
       print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...