По некоторым причинам, Selenium Webscraping возвращает только частичное, а не все. Не уверен, что какие-либо динамические данные находятся в фоновом режиме - PullRequest
0 голосов
/ 30 апреля 2018

Python и Selenium начинающий здесь. Я пытаюсь вычеркнуть заголовки разделов класса Udemy. Я пытался использовать find_elements_by_class_name и другие, но по какой-то причине возвращает только частичные данные.

страница, которую я очищаю: https://www.udemy.com/selenium-webdriver-with-python3/

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

2) Я хочу получить название подразделов.

from selenium import webdriver

driver = webdriver.Chrome()

url = 'https://www.udemy.com/selenium-webdriver-with-python3/'

driver.get(url)

main_titles = driver.find_elements_by_class_name("lecture-title-text")

sub_titles =  driver.find_elements_by_class_name("title")

Задача

1) Используя main_titles, я получил длину только 10. Она идет только от введения к модулям. Работа с файлами, а те, в конце концов, не выходят. Тем не менее, имена классов точно такие же. Не уверен, почему это не так. Modules / WorkingWithFiles - это точка отсечения. Элементы в инспекции также выглядит по-другому на этом этапе. Все они имеют одинаковый тег класса span, но не уверены, почему возвращается только частичное

<span class="lecture-title-text">

Проверка элементов между заголовком модулей и заголовком WorkingWithFiles

В этот момент веб-скребок разрушается. Не уверен почему.

2) Используя субтитры, я получил длину 58 элементов, но когда я распечатывал их, я получал только два верхних:

Introduction
How to reach me anytime and ask questions? *** MUST WATCH ***

После этого все пустые строки. Не уверен, почему он тянет только две верхние, а не остальные, когда все теги имеют

<div class='title'>

Возможно, я мог бы попытаться использовать BeautifulSoup, но в настоящее время я пытаюсь стать лучше, используя Selenium. Есть ли динамическое содержание, выбрасывающее царапину селена, или я не очищаю ее должным образом?

Спасибо, ребята, за вклад. Простите за длинный пост. Я хотел убедиться, что я правильно описал проблему.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Хорошо, я просмотрел предложения в комментариях и решил их. Я пишу это здесь на случай, если кто-нибудь в будущем захочет увидеть, как пошло решение.

1) Используя предложения, я дал команду щелкнуть «еще 24 раздела», чтобы развернуть вкладку, а затем очистить ее, что сработало отлично!

driver.find_element_by_class_name("js-load-more").click()
titles = driver.find_elements_by_class_name("lecture-title-text")
for each in titles:
    print (each.text)

Это вытащило все 34 заголовка раздела.

2) Используя предложение Мэтта, я нашел WebElement и использовал get_attribute ('textContent') для извлечения текстовых данных. Было множество пробелов, поэтому я использовал split (), чтобы получить только строки.

sub_titles = driver.find_elements_by_class_name("title")
for each in sub_titles:
    print (each.get_attribute('textContent').strip())

Это вытащило все 210 заголовков подразделов!

0 голосов
/ 30 апреля 2018

Причина, по которой вы получаете только первые 10 разделов, заключается в том, что отображаются только первые десять курсов. Вы можете войти в свой браузер, поэтому, когда вы идете, чтобы проверить его, он показывает каждый раздел. Но для меня и вашего скребка он показывает только первые 10. Вам нужно нажать эту кнопку .section-container--more-sections, прежде чем искать названия.

Что касается странного случая, когда title s не очищается должным образом: это потому, что когда элемент скрыт, атрибут text всегда будет неопределенным, поэтому он работает только для первого раздела. Я бы попробовал использовать WebElement.get_attribute('textContent') для очистки текста.

...