CoderCastrov logo
CoderCastrov
Питон3

Beautiful Soup4 Python

Beautiful Soup4 Python
просмотров
4 мин чтение
#Питон3

Beautiful Soup - это библиотека Python для извлечения данных из файлов HTML и XML. Она предоставляет естественные средства обхода, поиска и изменения дерева разбора в сочетании с выбранным парсером. Программисты часто экономят часы и даже дни усилий.

Установка Beautiful Soup

Если у вас установлен Debian или Ubuntu, вы можете установить Beautiful Soup с помощью системного менеджера пакетов

apt-get install python-bs4

Beautiful Soup 4 опубликован в PyPi, поэтому, если вы не можете установить его с помощью системного менеджера пакетов, вы можете установить его с помощью easy_install или pip. Название пакета - beautifulsoup4, и тот же пакет работает в Python 2 и Python 3.

с помощью easy_install..

easy_install beautifulsoup4

с помощью pip

pip install beautifulsoup4

Если у вас нет установленных easy_install или pip, вы можете скачать исходный tar-архив Beautiful Soup 4 и установить его с помощью setup.py. python setup.py install

Использование BeautifulSoup

Сразу после установки вы можете начать использовать BeautifulSoup. В начале вашего скрипта на Python импортируйте библиотеку. Теперь вам нужно передать что-то в BeautifulSoup, чтобы создать объект soup. Это может быть документ или URL. BeautifulSoup сам не загружает веб-страницу, вам нужно сделать это самостоятельно. Поэтому я использую urllib2 в сочетании с библиотекой BeautifulSoup.

Фильтрация

Существуют различные фильтры, которые вы можете использовать с помощью API поиска. Ниже я покажу вам несколько примеров того, как вы можете передавать эти фильтры в методы, такие как find_all. Вы можете использовать эти фильтры на основе имени тега, его атрибутов, текста строки или их комбинации.

Строка

Самый простой фильтр - это строка. Передайте строку в метод поиска и Beautiful Soup выполнит сопоставление с этой точной строкой. Этот код находит все теги 'b' в документе (вы можете заменить 'b' на любой тег, который вы хотите найти)

soup.find_all('b')

Если вы передаете байтовую строку, Beautiful Soup будет считать, что строка закодирована в UTF-8. Вы можете избежать этого, передав вместо этого строку Unicode.

Регулярное выражение

Если вы передаете объект регулярного выражения, Beautiful Soup будет фильтровать по этому регулярному выражению, используя метод match(). Этот код находит все теги, имена которых начинаются с буквы "b", в данном случае тег 'body' и тег 'b':

import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)

Этот код находит все теги, имена которых содержат букву "t":

for tag in soup.find_all(re.compile("t")):
    print(tag.name)

Список

Beautiful Soup позволяет сопоставить строку с любым элементом списка, если вы передаете его в функцию. Этот код находит каждый тег 'a' и 'b'.

print soup.find_all(["a", "b"])

True

True соответствует любому возможному совпадению. Текстовые строки не находятся этим кодом, только теги в документе:

for tag in soup.find_all(True):
    print(tag.name)

Функция

Создайте функцию, которая принимает элемент в качестве аргумента, если ни одно из других совпадений не подходит для вас. Для этого обратитесь к официальной документации.

Объект BeautifulSoup

Мы будем использовать текущий веб-сайт (https://pythonforbeginners.com) в качестве примера. Мы просто создаем объект BeautifulSoup для него, чтобы распарсить данные из содержимого. Это создаст объект soup, содержащий информацию из предоставленного URL. Теперь, когда мы достигли этой точки, объект soup можно использовать с методами Beautiful Soup. Дерево разбора BS может быть преобразовано в удобно форматированную строку Unicode с помощью функции prettify.

Метод Find_all

Один из самых часто используемых методов в BeautifulSoup - это find_all. Он ищет потомков тега и возвращает все совпадения для ваших фильтров.

soup.find_all("title")

soup.find_all("p", "title")

soup.find_all("a")

soup.find_all(id="link2")

Давайте посмотрим на несколько примеров использования BS 4

from bs4 import BeautifulSoup
import urllib2

url = "https://www.pythonforbeginners.com"

content = urllib2.urlopen(url).read()

soup = BeautifulSoup(content)

print(soup.prettify())

print(title)
>> 'title'? Python For Beginners

print(soup.title.string)
>> ? Python For Beginners

print(soup.p)print(soup.a)
[Python For Beginners](https://www.pythonforbeginners.com/)

Навигация по дереву разбора

Если вы хотите узнать, как навигироваться по дереву, пожалуйста, ознакомьтесь с официальной документацией. Там вы можете прочитать о следующих возможностях:

Переход вниз

  • Навигация по тегам
  • .contents и .children
  • .descendants
  • .string, .strings и stripped_strings

Переход вверх

  • .parent
  • .parents

Переход в сторону

  • .next_sibling и .previous_sibling
  • .next_siblings и .previous_siblings

Переход вперед и назад

  • .next_element и .previous_element
  • .next_elements и .previous_elements

Извлечение всех URL-адресов, найденных внутри тегов 'a' на странице

Извлечение всех URL-адресов, находящихся внутри тегов "a" на странице, является частой задачей. Метод find_all предоставляет нам полный список элементов с тегом "a".

for link in soup.find_all('a'):
    print(link.get('href'))Output:..https://www.pythonforbeginners.com
..https://www.pythonforbeginners.com/python-overview-start-here/
..https://www.pythonforbeginners.com/dictionary/
..https://www.pythonforbeginners.com/python-functions-cheat-sheet/
..https://www.pythonforbeginners.com/lists/python-lists-cheat-sheet/
..https://www.pythonforbeginners.com/loops/
..https://www.pythonforbeginners.com/python-modules/
..https://www.pythonforbeginners.com/strings/
..https://www.pythonforbeginners.com/sitemap/
...
...

Извлечение всего текста со страницы

Еще одна обычная задача - извлечение всего текста со страницы:

print(soup.get_text())Output:Python для начинающих
Основы Python
Словари
Функции
Списки
Циклы
Модули
Строки
Карта сайта
...
...

Получение всех ссылок с Reddit

В качестве последнего примера давайте получим все ссылки с Reddit:

from bs4 import BeautifulSoup
import urllib2

redditFile = urllib2.urlopen("http://www.reddit.com")
redditHtml = redditFile.read()
redditFile.close()

soup = BeautifulSoup(redditHtml)
redditAll = soup.find_all("a")
for links in soup.find_all('a'):
    print (links.get('href'))Output:#content
..http://www.reddit.com/r/AdviceAnimals/
..http://www.reddit.com/r/announcements/
..http://www.reddit.com/r/AskReddit/
..http://www.reddit.com/r/atheism/
..http://www.reddit.com/r/aww/
..http://www.reddit.com/r/bestof/
..http://www.reddit.com/r/blog/
..http://www.reddit.com/r/funny/
..http://www.reddit.com/r/gaming/
..http://www.reddit.com/r/IAmA/
..http://www.reddit.com/r/movies/
..http://www.reddit.com/r/Music/
..http://www.reddit.com/r/pics/
..http://www.reddit.com/r/politics/
...

Для получения дополнительной информации, пожалуйста, ознакомьтесь с официальной документацией.

Если этот пост был полезен, пожалуйста, нажмите несколько раз кнопку 👏, чтобы показать свою поддержку автору 👇

🚀Читайте похожие истории, присоединяйтесь к FAUN.