Парсинг сайтов на Python: Приемы работы с библиотекой BeautifulSoup
Вставка
- Опубліковано 22 вер 2024
- Мои курсы:
Boosty:
boosty.to/omol...
Patreon:
/ karty-vsekh-41011404
Скринкаст о некоторых приемах работы с Python-библиотекой для парсинга сайтов (HTML, XML) - BeautifulSoup 4.
Рассказываю о методах:
- .find() и .find_all()
- .find_parent() и find_parents()
- .next_sibling() и previous_sibling()
- .next_element() и previous_element()
- об использовании регулярных выражений
- о поиске конкретных тегов по их тексту
** ИСХОДНЫЙ КОД **
Основных проектов доступен в Patreon:
/ iskhodnyi-kod-26640469
***
🔷 Для донатов. Всегда очень признателен за это:
www.donational...
------
⭐ "Практический курс парсинга сайтов на Python" ⭐
Лендинг курса:
zaemiel.github...
О курсе и карта курса:
/ 30462246
Видео о курсе:
• Практический курс парс...
Как же сложно найти среди информационного мусора действительно хорошие материалы. Олег. спасибо Вам большое за Ваши уроки, они действительно хороши и толковы. Продолжайте в том же духе. На канал подписался, буду рекомендовать Вас знакомым.
Спасибо большое. Рад, что вам нравится.
+1
6 лет видео, каналов про пайтон сотни уже, но Олег топ- 1 по качеству объснения, посмотрел около двух десятков его уроков и восхищен, насколько он точными и несложными словами передает процесс написания кода и смысл всех действий.Лучше и понятней уже некуда, это потолок
Качество и доходчивость - 10 из 10.
Спасибо вам за ваш труд! На таких людях держится интернет :) желаю успехов в начинаниях и больше роликов! :)
Спасибо
Приятная и спокойная речь, ощущение как будто сидишь на берегу и созерцаешь как течет река. Машинально тянет на написание хокку. Спасибо за труды.
Спасибо :)
Супер, и суп и регулярку подтянул. Все бы делали такие уроки. Большинство обычно пропускает нудное объяснение что откуда берем, для чего и как, а зачастую именно это все новички и ищут
На конец-то качественная информация,как же сложно ее отыскать среди "мусора"...
Большое спасибо за урок!
Спасибо.
Хорошо разжевал, большое спасибо.
В видео не услышал, если кому интересно: "lxml" сторонний парсер(установить через pip), если не установлен, то ошибка библиотеки, встроенный html-парсер питона: "html.parser", он есть изначально и его не нужно устанавливать. Это для новичков, А ВИДОС КРУТОЙ, ВСЁ ПОНЯТНО И ДОХОДЧИВО. Спасибо автору за старания.
BeautifulSoup(html, "html.parser")
Олег, добрый день!
Спасибо большое за вашу работу, все очень понятно и доступно.
Ваш формат для тех, кто действительно хочет научиться и разобраться, а не "весь питон и парсинг всего интернета за один 10 минутный урок" , пожалуйста продолжайте, Вы очень хорошо объясняете.
Лучшие уроки по питону как минимум в русскоязычном UA-cam
Два дня искал нуж ную информацию, нашел только у Вас. Все доходчиво и понятно, спасибо!
Спасибо большое, замечательный урок, все максимально просто и понятно)
С такой качественной подачей материала ты явно заслуживаешь больше просмотров. Благодарочка тебе!
Это лучшее что есть в интернете. Спасибо!
Очень интересно) Собираюсь учить python сразу с прикладной задачи и Ваш канал думаю очень поможет)
Замечательное видео, спасибо тебе огромное!
Спасибо! Рад, что вам понравилось.
Заходите еще.
Было бы круто увидеть уроки по Scrapy. В русскоязычном youtube их нет!
2020, всё ещё актуально! Спасибо
Спасибо огромное за всё!
Интересно! Спасибо за видео
Неточность при написании регулярки 30:22
точка (.) - означает любой символ(в том числе и знаки табуляции)
чтобы регулярка искала именно точку, нужно было прописать "\."
Спасибо! Познавательно и самое главное - понятно!
лайк не глядя
Super!!! Thanks
Олег, спасибо Вам большое за Ваши обучающие видео!
Не знаю спрашивали ли у Вас уже или нет, но хотел выразить пожелание/предложение к Вам сделать серию обучающих видео по фреймворку Scrapy. В рунете про него минимум информации, несколько статей раскиданых по всему рунету и полтора русскоязычных ролика на ютубе. По нему нет даже переводов книг. Думаю многие бы выразили Вам свою признательность за подобные уроки по Scrapy и кроме этого это сильно добавило бы популярности Вашего youtube канала (хотя она и так на высоте).
Отличные уроки
Спасибо
Олег, я очень почитаю вашу деятельность. Если требуется что-то изучить то смотрю нет ли этого у вас:)))
P.S Дальнейшего развития и ещё большего миросозерцания!))
Спасибо большое!
Видео супер!!!!!!!!!
Незаслуженно обделен вниманием метод select(). При умелом обращении он обойдет и find(), и find_all() вместе взятые.
Очень доступно..
Добрый вечер скажите а это библиотека BeautifulSoup подойдет для парсинг аккаунтов в instagram или нет
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 16992: character maps to ошибки при открытии
решил проблему?
html = open('index.html', encoding='utf-8').read()
Просто нужно было указать кодировку.
Здравствуйте,у меня такая проблема,пожалуйста ответьте.
Методом href = find_all(class_="pi"),я вывожу список print(href)
В этом списке у каждого класса pi есть href = ссылка. Я это вижу.
После этого мне нужна эта ссылка,я делаю: for i in href: url = i.get("href") list.append(url) print(list)
Я вывожу список лист,в который записывал ссылки href, но в него ничего не записалось. Т.е. выводит None,None,None... .
Не находит href ссылку,или не может найти я незнаю,но мне очень нужно.Что делать,помогите пожалуйста
А отличие .text от .string в том, что .string возвращает None, если элемент пуст, а .text возвращает пустую строку? Или есть еще какие-то отличия?
а как можно ввести данные на сайте?
например отправка сообщений,коментов заполнение - в общем любых input-полей?
В этом может помочь библиотека selenium. Погугли
5+
Спасибо
Олег, можешь пожалуйста подсказать. Каким образом реализуется парсинг динамических данных, например плей лист радио, которое меняется каждый раз, когда один трек закончился и начался новый? Имеется ли подобный метод в BS, который в режиме онлайн отслеживает изменения или возможно для этого используется другая библиотека?
Тут нужно юзать селениум, или отследить запросы и отправлять их напрямую.
Подскажите пожалуйста, как в pycharm запустить. В терминале пустота. Все перетыкал уже
Здравствуйте, не могу привязаться к элементам , и сверху и снизу h2
req = div.find('h2').find_parent('h2')
не находит не чего
выше идет div
вписываю в парент - див, и выдает все и даже то , что выше , перескакивает на div который выше и там инфу захватывает , которая мне не нужна,
не могу понять, как тут быть?) может сможете помочь
Хорошо бы еще вариант с таблицами (имеющими свои css стили, в том числе) рассмотреть примеры
посмотрите видео про парсинг сайта в несколько процессов - там как раз таблица парсилась.
@@zaemiel спасибо, гляну. Пробую работать с сайтом cataloxy.ru - но он постоянно банит мои ip
При попытке открыть файл (html = open('index.html').read()) возникает ошибка:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 757: ordinal not in range(128)
Что может быть не так?
Смени кодировку с asii на UTF-8
Спасибо за видео, во всем разобрался. Небольшой вопрос, по тегам и остальному все понял, а вот как сам текст извлечь . text = soup.find(attrs= {'name': 'description'}) - так он целиком показывает, но оно и понятно, а как сам текст, додумать не получается.
текст извлекается свойством .text
✔
Больше спасибо за предоставленное видео ! Очень помогло )
Единственное возник вопрос, что время от времени выскакивает ошибка "AttributeError: 'NoneType' object has no attribute 'find_all'". Повторюсь, эта ошибка выскакивает не всегда. С чем это может быть связанно ?
NoneType... означает, что объект, который вызывает find_all, скорее всего пуст. Попробуйте вывести его на печать...
В том-то и дело, что они не пустые. Потому-что после нескольких повторных запусков выдается нормальный результат. Я никак не могу понять закономерность таких вот результатов :) Может ли это быть связанно с тем, что объект для исследований выбран 'instagram' ?
Не всегда пустой, но чаще это бывает именно так... поэтому и написал, что "скорее всего"...
Проверьте тип полученного объекта - find(), find_all() и т.п. - это методы объектов Супа...
Если у вас переменная ссылается на другой объект (не Супа), то соответствующих методов у него точно нет - поэтому и возбуждается это исключение "AttributeError"
По вашем описанию, кажется, что 'instagram' - это уже строка
попробуй вместо find_all прописать findAll
результат не изменится.
изначально этот метод назывался findAll (и другие тоже были в camel-case). А потом грянул PEP8 и стандартом названия для методов и функций стал snake-case, и все методы снабдили элиасами (alias), т.е. псевдонимами.
Так родился find_all()
Но это один и тот же метод.
NoneType означает, что объект, которые вызывает find(), find_all() и другие методы Супа, объектом Супа не является, либо пуст.
Нужно проверять тип данных у того объекта, на который ссылается переменная.
print(type(variable)) - и сразу станет все понятно
5:18 пробую по видео, у меня вместо кириллицы выводит иероглифы, хотя в браузере всё нормально отображается. Что не так??
Кодировку на Юникод менять пробовал?
Спасибо за уроки !
Вот с помощью get('href') мы получаем ссылку.
А как получить только текст ссылки?
.text
Большое спасибо!
Олег подскажите как выводить данные своей функции(спарсенный с ЦБ курс USD) в проекте Django на html странице ? И как лучше такие данные выводить ? Записать в файл и уже из него эти данные будут выводиться на странице по реквесту пользователя ? Или есть другие методы?
Можно из вьюх вызывать парсер, можно из моделей (если у вас логика такая).
Django'вские .py файлы это по-сути обычные скрипты, вызываете в нужном месте парсер и все. Просто решите, в какой момент это нужно делать.
Олег, я пытался из views.py это делать, но знаний не хватает как оформить функцию... Гуглил, но не нашел пока способ с примером.
и что же вы гуглили? Как делать импорт функций в другие модули?
Парсер - это функция, которая возвращает результат. Единственное, что нужно сделать - вызвать эту функцию и получить результат. Затем у вас были какие-то планы по поводу того, что с этим результатом нужно сделать.
Не могу понять почему иногда у метода не указываются "()", как например у метода "text" или "parent". Обычно просто через точку вызываются атрибуты класса, если в конце нет "()", а с ними как раз методы.
Это атрибуты, но не методы, а свойства. Поэтому там нет скобок.
Тогда я все правильно понимаю. Просто в книгах, которые я читал автор допускал свойства класса называть и атрибутами класса, поэтому я так и написал. Благодарю за оперативность.
Олег, не подскажешь, в каком видео вы показывали способ удаление пустых строк в файле формта csv. Не могу найти
Я сам не помню
@@zaemiel:)) Я уже узнал. Кому надо - там необходимо заранее прописать newline='''
@@zaemiel Олег, тебе большой ресспект! Таких уроков на русском я больше нигде не видел!
Спасибо
@@Нострадамус-у3в А где прописывать?
помогите установить bs4 в sublime 3. я его не могу найти в package control? bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library? это, его же не видит. Вроде установлен, а что не так не пойму?
BeautifulSoup - это библиотека языка Python.
Она не имеет отношения к редактору текста Sublime Text.
Чтобы установить BeautifulSoup выполните в консоли эту команду:
pip install beautifulsoup4
Сам Суп используют парсеры, у вас должен быть установлен также парсер lxml. Проверьте это командой:
pip freeze
(найдите его в списке)
Если lxml не установлен, то, чтобы его установить выполните в консоли:
pip install lxml
у меня проблема с методом find_all, он у меня почему-то возвращает список. В чем может быть проблема не подскажите?
Не очень понял вашу проблему.
Можно сказать, что .find_all() возвращает список. На самом деле нет, но это зависит от вашей задачи (проблемы), которую вы хотите решить.
File "C:\Users\work\AppData\Local\Programs\Python\Python37-32\lib\encodings\cp1251.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 16992: character maps to
[Finished in 0.6s]
Модуль lxml должен быть установлен?
Да
lxml входит в стандартную поставку, т.е. ставится в систему по дефолту.
Если вдруг это не так, то как обычно:
pip install lxml
Подскажите почему у меня ошибка:
"UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 173: ordinal not in range(128)"?
- какая у вас операционная система?
- ошибка потому, что попался не ascii символ типа знака доллара или еще что-то
Олег Молчанов - macOS
Я так понимаю нужно привести к Unicode, но не понимаю где и как это сделать
да, верно, понимаете
В результате чего выдается такая ошибка?
Олег Молчанов print(div)
Div - найденный так же как у Вас объект soap
а в консоли нормально выводит?
Олег Привет!
Скажи пожалуйста в чем проблема,почему у меня после конвертирования в exe файл выдает такую ошибку?
prnt.sc/lb1mhc
к сожалению, я не знаю
@@zaemiel Я разобрался,надо переустановить библиотеку под нужно/новую версию..
Все равно спасибо что ответил)
Помогите, пожалуйста, глупому написать регулярное выражение. Есть строка ' 9 900 911 р 123 т '. В первом случае надо извлечь 9900911, а во втором 123. Обращаю внимание, что между цифрами есть пробелы, а на выход надо без пробелов, что бы именно 9900911. Как только не пробовал, но все не то. Могу решить задачу через цикл, но это как-то не правильно.
Если в этой строке только эти данные и других нет, то можно и без регулярного выражения это получить.
.strip(), затем .split() каким может быть критерий деления нужно смотреть, хоть "р", но у вас в итоге будет список из 2-х элементов.
Там могут встречаться два символа, либо т, либо р, но иногда другие. Я убрал сначала через цикл все лишнее, потом через split сделал список и уже пользовался. Но мне кажется, что через РВ решать правильнее.
Думаю, что вот такое должно подойти:
[\d ]+
После \d стоит пробел
С использованием re.findall() даст список этих чисел
Тему с регулярными выражениями всегда откладывал на потом. Теперь взялся. Почему-то очень сложно дается. Вроде бы все не трудно, а идет со скрипом.
Помогите начинающему! Сохраняю некоторые страницы для парсинга. Но Python не открывает их. Пишет: Traceback (most recent call last):
File "C:/Programming/Python test/Parsing/parser.py", line 19, in
main()
File "C:/Programming/Python test/Parsing/parser.py", line 11, in main
html = open('Хоккей - Континентальная Хоккейная Лига - Чемпионат России по хоккею - Официальный сайт КХЛ.html').read()
File "C:\Users\Crocodile\AppData\Local\Programs\Python\Python36-32\lib\encodings\cp1251.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 42680: character maps to
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 42680
Попался не ASCII символ - типа знака фунта стерлингов, рубля, кириллицы и т.п.
Одна из особенностей Windows заключается в том, что она не знает что такое Unicode
попробуйте указать кодировку явно:
file = open(filename, encoding="utf8")
Лучше, конечно, избегать кириллицы, верхнего регистра и пробелов в путях и именах файлов
Спасибо огромное. Заработало. Я и сам понял, что с кодировкой проблемы, но как решить не смог догадаться. Хотя теперь вспомнил, что читал про явное объявление кодировки. Еще раз спасибо.
Всегда пожалуйста
TypeError: object of type 'Response' has no len() Вот что выводит
Объекты класса Response не являются итерируемыми объектами и у них нельзя определить длину.
Видео, конечно, рассчитано на начинающих, но основы языка нужно знать в любом случае.
Олег Молчанов Моя не внимательность. Ошибка была исправлена путём добавления к функции BeautifulSoup в первым аргументом после переменной с url страницы .text
Какой питон юзаете? 3 или 2.7?
постоянно используемая мной функция print() как бы намекает, что это Python 3.
Я использую только Python 3
ну я первый раз на канале, так что не очень следил за функциями)
я не имел в виду канал.
Я имел в виду данный конкретный скринкаст.
Какие мудаки ставят дизлайки!!!
...
Молчанов, что-то ты какой-то немолчаливый.
А вы как-то на утку не особо похожи.
@@zaemiel А почему Вы обращаетесь ко Мне во множественном числе?
НЕХРЕНА НЕ РАБОТАЕТ У МЕНЯ!!! сука разобью я этот ноутбук, что за нафиг такой ошибка на ошибке
IndentationError: unindent does not match any outer indentation level
что делать в чем проблемма?
вы хоть один туториал по пайтону проработали?
Исключение говорит о том, что идентация (отступы) неправильная. Это ошибка первого уровня дебилизма. Когда нужно просто проверить отступы.
4 пробела.
Либо табы, которые конвертируются в пробелы.
Выделите весь код Ctrl + A
И найдите в меню вашего редактора что-то вроде Convert to spaces
да разобрался я с отсутпами, теперь другая проблемма, при вызове
OSError: [WinError 6] Неверный дескриптор
ну ведь данное видио для новичков, поэтому и вопросы первоуровневые
Видео для новичков, которые догадались хоть один туториал по языку проработать. Для тех, кто уже хоть что-то знает.
Спасибо
Спасибо