Как установить beautifulsoup python
Перейти к содержимому

Как установить beautifulsoup python

  • автор:

Установка Beautifulsoup и примеры

Разберем как производится установка beautifulsoup — библиотеки, которая позволяет работать с содержимым веб-страниц в интернете, извлекая из больших объемов структурированной информации нужную. Используется для парсинга.

Python beautifulsoup: установка и использование, примеры

Прежде всего, создадим виртуальное окружение. Назвать его можно, например, parser

Подробнее о виртуальном окружении и необходимых для его работы пакетах

(parser) admin@desktop:/

В терминале после активации появляется указанное ранее имя.

Как установить beautifulsoup python

BeautifulSoup является частью библиотеки bs4, парсер также требует requests, все устанавливается через pip из окружения

Successfully installed certifi-2018.8.24 chardet-3.0.4 idna-2.7 requests-2.19.1 urllib3-1.23 beautifulsoup4-4.6.3 bs4-0.0.1

Пример вывода на скриншоте:

Установка Beautifulsoup

Установка завершена, теперь можно перейти к созданию скрипта

import requests from bs4 import BeautifulSoup page = requests.get('https://yandex.ru') soup = BeautifulSoup(page.text, 'html.parser')

Создается объект BeautifulSoup, в скобках указываются два параметра.

Первый — результат применения метода text к содержимому переменной page. Переменная page содержит текст страницы, путь к которой задан.

Второй аргумент — html.parser

С данными далее можно производить любые манипуляции.

Пример форматирования результата полученного с помощью BeautifulSoup

Добавим в скрипт такие строки

city = soup.find(class_='geolink__reg') print (city.prettify())

Вызов скрипта из консоли

Скрипт спарсил главную страницу Яндекса и получил содержимое тега с классом geolink__reg из HTML кода. Класс выбран для демонстрации при визуальном анализе исходного кода (CTRL+U в браузере).

В данном случае в нем находится город, определенный при помощи geoip

Здесь используется метод prettify, который позволяет создавать отформатированное дерево тегов с результатами поиска.

Теперь закомментируем последний print и вместо него

city = soup.find(class_='geolink__reg') #print (city.prettify) print (city.contents[0])

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

Екатеринбург

Это достигнуто использованием contents[0], все лишние тэги удалены. Результаты парсинга можно сохранять в csv файлы или обычные текстовые документы. Записывать можно не все, а выбирать только нужное содержимое работая с ним как с текстом.

Скрипты с BeautifulSoup можно запускать по какому-то расписанию по системному планировщику задач CRON

How To Install BeautifulSoup

To install BeautifulSoup on a MacOS or Linux machines run:

 sudo pip3 install beautifulsoup4 

To install BeautifulSoup on a Windows machine run:

 pip3 install beautifulsoup4 

To import BeautifulSoup into your Python script:

  from bs4 import BeautifulSoup 

Then to use BeautifulSoup to parse a HTML file, simply initialize a BeautifulSoup instance with the HTML file.

from bs4 import BeautifulSoup html_doc = """    

Hello!

""" soup = BeautifulSoup(html_doc, 'html.parser') print(soup.find('h1').get_text()) # --> 'Hello!'

In this guide for The Python Web Scraping Playbook, we will look at how to install and use Python’s popular BeautifulSoup library on Windows, MacOS, Linux machines.

We will walk your through:

  • How To Install BeautifulSoup On MacOS & Linux
  • How To Install BeautifulSoup On Windows
  • How To Import & Setup BeautifulSoup

First, let’s get a quick overview of what is BeautifulSoup.

How To Install BeautifulSoup On MacOS & Linux​

Installing Python’s BeautifulSoup on a MacOS machine is very straightforward.

Step 1: Install Latest Python Version​

To do so, run the following command in your terminal:

 python3 --version >> Python 3.11.0 

Step 2: Upgrade Pip​

Next upgrade pip to the latest version to avoid any installation issues.

 sudo pip3 install --upgrade pip 

Step 3: Install BeautifulSoup​

Finally, we just need to install BeautifulSoup.

 sudo pip3 install beautifulsoup4 

How To Install BeautifulSoup On Windows​

Installing Python’s BeautifulSoup on a Windows machine is very straightforward.

Step 1: Install Latest Python Version​

To do so, run the following command in your terminal:

 python3 --version >> Python 3.11.0 

Step 2: Upgrade Pip​

Next upgrade pip to the latest version to avoid any installation issues.

 pip3 install --upgrade pip 

Step 3: Install BeautifulSoup​

Finally, we just need to install BeautifulSoup.

 pip3 install beautifulsoup4 

How To Import & Setup BeautifulSoup​

To import BeautifulSoup into your Python script import BeautifulSoup from the bs4 module:

  from bs4 import BeautifulSoup 

Then to use BeautifulSoup to parse a HTML file, simply initialize a BeautifulSoup instance with the HTML file.

from bs4 import BeautifulSoup html_doc = """    

Hello!

""" soup = BeautifulSoup(html_doc, 'html.parser') print(soup.find('h1').get_text()) # --> 'Hello!'

More Web Scraping Tutorials​

So that’s how to install Python BeautifulSoup.

If you would like to learn more about how to use BeautifulSoup then check out our other BeautifulSoup guides:

  • BeautifulSoup Guide: Scraping HTML Pages With Python
  • Fix BeautifulSoup Returns Empty List or Value
  • How To Use BeautifulSoup’s find() Method
  • How To Use BeautifulSoup’s find_all() Method

Or if you would like to learn more about Web Scraping, then be sure to check out The Python Web Scraping Playbook.

Or check out one of our more in-depth guides:

  • How to Scrape The Web Without Getting Blocked Guide
  • The State of Web Scraping 2020
  • The Ethics of Web Scraping
  • How To Install BeautifulSoup On MacOS & Linux
    • Step 1: Install Latest Python Version
    • Step 2: Upgrade Pip
    • Step 3: Install BeautifulSoup
    • Step 1: Install Latest Python Version
    • Step 2: Upgrade Pip
    • Step 3: Install BeautifulSoup

    Модуль BeautifulSoup4 в Python, разбор HTML

    BeautifulSoup4 (bs4) — это библиотека Python для извлечения данных из файлов HTML и XML. Для естественной навигации, поиска и изменения дерева HTML, модуль BeautifulSoup4, по умолчанию использует встроенный в Python парсер html.parser . BS4 так же поддерживает ряд сторонних парсеров Python, таких как lxml , html5lib и xml (для разбора XML-документов).

    Установка BeautifulSoup4 в виртуальное окружение:

    # создаем виртуальное окружение, если нет $ python3 -m venv .venv --prompt VirtualEnv # активируем виртуальное окружение $ source .venv/bin/activate # ставим модуль beautifulsoup4 (VirtualEnv):~$ python3 -m pip install -U beautifulsoup4

    Содержание:

    • Выбор парсера для использования в BeautifulSoup4.
      • Парсер lxml .
      • Парсер html5lib .
      • Встроенный в Python парсер html.parser .
      • Навигация по структуре HTML-документа.
      • Извлечение URL-адресов.
      • Извлечение текста HTML-страницы.
      • Поиск тегов по HTML-документу.
      • Поиск тегов при помощи CSS селекторов.
      • Дочерние элементы.
      • Родительские элементы.
      • Изменение имен тегов HTML-документа.
      • Добавление новых тегов в HTML-документ.
      • Удаление и замена тегов в HTML-документе.
      • Изменение атрибутов тегов HTML-документа.

      Выбор парсера для использования в BeautifulSoup4.

      BeautifulSoup4 представляет один интерфейс для разных парсеров, но парсеры неодинаковы. Разные парсеры, анализируя один и того же документ создадут различные деревья HTML. Самые большие различия будут между парсерами HTML и XML. Так же парсеры различаются скоростью разбора HTML документа.

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

      Различия в построении HTML-дерева разными парсерами, разберем на короткой HTML-разметке: .

      Парсер lxml .
      • Для запуска примера, необходимо установить модуль lxml .
      • Очень быстрый, имеет внешнюю зависимость от языка C.
      • Нестрогий.
      >>> from bs4 import BeautifulSoup >>> BeautifulSoup(" ", "lxml") # 

      Обратите внимание, что тег заключен в теги и , а висячий тег

      просто игнорируется.

      Парсер html5lib .
      • Для запуска примера, необходимо установить модуль html5lib .
      • Ну очень медленный.
      • Разбирает страницы так же, как это делает браузер, создавая валидный HTML5.
      >>> from bs4 import BeautifulSoup >>> BeautifulSoup(" ", "html5lib") # 

      Обратите внимание, что парсер html5lib НЕ игнорирует висячий тег

      , и к тому же добавляет открывающий тег

      . Также html5lib добавляет пустой тег ( lxml этого не сделал).

      Встроенный в Python парсер html.parser .
      • Не требует дополнительной установки.
      • Приличная скорость, но не такой быстрый, как lxml .
      • Более строгий, чем html5lib .
      >>> from bs4 import BeautifulSoup >>> BeautifulSoup(" ", 'html.parser') # 

      Как и lxml , встроенный в Python парсер игнорирует закрывающий тег

      . В отличие от html5lib , этот парсер не делает попытки создать правильно оформленный HTML-документ, добавив теги или .

      Вывод: Парсер html5lib использует способы, которые являются частью стандарта HTML5, поэтому он может претендовать на то, что его подход самый «правильный«.

      Основные приемы работы с BeautifulSoup4.

      Чтобы разобрать HTML-документ, необходимо передать его в конструктор класса BeautifulSoup() . Можно передать строку или открытый дескриптор файла:

      from bs4 import BeautifulSoup # передаем объект открытого файла with open("index.html") as fp: soup = BeautifulSoup(fp, 'html.parser') # передаем строку soup = BeautifulSoup("a web page", 'html.parser') 

      Первым делом документ конвертируется в Unicode, а HTML-мнемоники конвертируются в символы Unicode:

      >>> from bs4 import BeautifulSoup >>> html = " Sacré bleu!" >>> parse = BeautifulSoup(html, 'html.parser') >>> print(parse) # Sacré bleu! 

      Дальнейшие примеры будут разбираться на следующей HTML-разметке.

      html_doc = """html>head>title>The Dormouse's storytitle>head> body> p class="title">b>The Dormouse's storyb>p> p class="story">Once upon a time there were three little sisters; and their names were a href="http://example.com/elsie" class="sister" id="link1">Elsiea>, a href="http://example.com/lacie" class="sister" id="link2">Laciea> and a href="http://example.com/tillie" class="sister" id="link3">Tilliea>; and they lived at the bottom of a well.p> p class="story">. p>"""

      Передача этого HTML-документа в конструктор класса BeautifulSoup() создает объект, который представляет документ в виде вложенной структуры:

      >>> from bs4 import BeautifulSoup >>> soup = BeautifulSoup(html_doc, 'html.parser') >>> print(soup.prettify()) # # # # The Dormouse's story #  #  # # 

      # # The Dormouse's story # #

      #

      # Once upon a time there were three little sisters; and their names were # # Elsie # # , # # Lacie # # and # # Tillie # # ; and they lived at the bottom of a well. #

      #

      # . #

      # #

      Навигация по структуре HTML-документа:

      # извлечение тега `title` >>> soup.title # The Dormouse's story # извлечение имя тега >>> soup.title.name # 'title' # извлечение текста тега >>> soup.title.string # 'The Dormouse's story' # извлечение первого тега `

      ` >>> soup.p #

      # извлечение второго тега `

      ` и # представление его содержимого списком >>> soup.find_all('p')[1].contents # ['Once upon a time there were three little sisters; and their names were\n', # # ',\n', # # ' and\n', # # ';\nand they lived at the bottom of a well.'] # выдаст то же самое, только в виде генератора >>> soup.find_all('p')[1].strings #

      Перемещаться по одному уровню можно при помощи атрибутов .previous_sibling и .next_sibling . Например, в представленном выше HTML, теги обернуты в тег

      — следовательно они находятся на одном уровне.

      >>> first_a = soup.a >>> first_a # >>> first_a.previous_sibling # 'Once upon a time there were three little sisters; and their names were\n' >>> next = first_a.next_sibling >>> next # ',\n' >>> next.next_sibling # Так же можно перебрать одноуровневые элементы данного тега с помощью .next_siblings или .previous_siblings .
      for sibling in soup.a.next_siblings: print(repr(sibling)) # ',\n' # # ' and\n' # # '; and they lived at the bottom of a well.' for sibling in soup.find(id="link3").previous_siblings: print(repr(sibling)) # ' and\n' # # ',\n' # # 'Once upon a time there were three little sisters; and their names were\n' 

      Атрибут .next_element строки или HTML-тега указывает на то, что было разобрано непосредственно после него. Это могло бы быть тем же, что и .next_sibling , но обычно результат резко отличается.

      last_a = soup.find("a", id="link3") last_a # last_a.next_sibling # ';\nand they lived at the bottom of a well.' 
      last_a_tag.next_element # 'Tillie' 

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

      Атрибут .previous_element является полной противоположностью .next_element . Он указывает на элемент, который был обнаружен при разборе непосредственно перед текущим:

      last_a_tag.previous_element # ' and\n' last_a_tag.previous_element.next_element # При помощи атрибутов .next_elements и .previous_elements можно получить список элементов, в том порядке, в каком он был разобран парсером.
      for element in last_a_tag.next_elements: print(repr(element)) # 'Tillie' # ';\nand they lived at the bottom of a well.' # '\n' # # '. ' # '\n' 

      Извлечение URL-адресов.

      Одна из распространенных задач, это извлечение URL-адресов, найденных на странице в HTML-тегах :

      >>> for a in soup.find_all('a'): . print(a.get('href')) # http://example.com/elsie # http://example.com/lacie # http://example.com/tillie 

      Извлечение текста HTML-страницы.

      Другая распространенная задача — извлечь весь текст со HTML-страницы:

      # Весь текст HTML-страницы с разделителями `\n` >>> soup.get_text('\n', strip='True') # "The Dormouse's story\nThe Dormouse's story\n # Once upon a time there were three little sisters; and their names were\n # Elsie\n,\nLacie\nand\nTillie\n;\nand they lived at the bottom of a well.\n. " # а можно создать список строк, а потом форматировать как надо >>> [text for text in soup.stripped_strings] # ["The Dormouse's story", # "The Dormouse's story", # 'Once upon a time there were three little sisters; and their names were', # 'Elsie', # ',', # 'Lacie', # 'and', # 'Tillie', # ';\nand they lived at the bottom of a well.', # '. '] 

      Поиск тегов по HTML-документу:

      Найти первый совпавший HTML-тег можно методом BeautifulSoup.find() , а всех совпавших элементов — BeautifulSoup.find_all() .

      # ищет все теги ``</span> <span >>>></span> <span >soup</span><span >.</span><span >find_all</span><span >(</span><span >"title"</span><span >)</span> <span ># [<title>The Dormouse's story] # ищет все теги `` и все теги `` >>> soup.find_all(["a", "b"]) # [The Dormouse's story, # # # # ищет все теги `

      ` с CSS классом "title" >>> soup.find_all("p", "title") # [

      ]
      # ищет все теги с CSS классом, в именах которых встречается "itl" soup.find_all(class_=re.compile("itl")) # [

      ]
      # ищет все теги с >>>> soup.find_all(id="link2") # [# ищет все теги ``, содержащие указанные атрибуты >>> soup.find_all('a', attrs='class': 'sister', 'id': 'link1'>) # [# ищет текст внутри всех тегов, который содержит 'sisters' >>> import re >>> soup.find(string=re.compile("sisters")) # 'Once upon a time there were three little sisters; and their names were\n' # ищет все теги, имена которых начинаются на букву 'b' for tag in soup.find_all(re.compile("^b")): print(tag.name) # body # b # ищет все теги в документе, но не текстовые строки for tag in soup.find_all(True): print(tag.name) # html # head # title # body # p # b # p # a # a # a # p

      Поиск тегов при помощи CSS селекторов:

      >>> soup.select("title") # [The Dormouse's story] >>> soup.select("p:nth-of-type(3)") # [Поиск тега под другими тегами:
      >>> soup.select("body a") # [# # >>> soup.select("html head title") # [The Dormouse's story] 

      Поиск тега непосредственно под другими тегами:

      >>> soup.select("head > title") # [The Dormouse's story] >>> soup.select("p > a:nth-of-type(2)") # [>>> soup.select("p > #link1") # [Поиск одноуровневых элементов:
      # поиск всех `.sister` в которых нет `#link1` >>> soup.select("#link1 ~ .sister") # [# # поиск всех `.sister` в которых есть `#link1` >>> soup.select("#link1 + .sister") # [# поиск всех `` у которых есть сосед `

      `

      Поиск тега по классу CSS:

      >>> soup.select(".sister") # [# # Поиск тега по ID:
      >>> soup.select("#link1") # [>>> soup.select("a#link2") # [ 

      Дочерние элементы.

        будут являться три тега
        и тег

          со всеми вложенными тегами.

        Обратите внимание, что все переводы строк \n и пробелы между тегами, так же будут считаться дочерними элементами. Так что имеет смысл заранее привести исходный HTML к «нормальному виду«, например так: re.sub(r’>\s+

        Извлечение ВСЕХ дочерних элементов. Эта операция похожа на рекурсивный обход HTML-дерева в глубину от выбранного тега.

        Обратите внимание, что простой текст, который находится внутри тега, так же считается дочерним элементом этого тега.

        Если внутри тега есть более одного дочернего элемента (как в примерен выше) и необходимо извлечь только текст, то можно использовать атрибут .strings или генератор .stripped_strings .

        Генератор .stripped_strings дополнительно удаляет все переводы строк \n и пробелы между тегами в исходном HTML-документе.

        >>> list(first_ul.strings) # ['текст 1', 'текст 2', 'текст 2-1', 'текст 2-2', 'текст 3'] >>> first_ul.stripped_strings # >>> list(first_ul.stripped_strings) # ['текст 1', 'текст 2', 'текст 2-1', 'текст 2-2', 'текст 3'] 

        Родительские элементы.

        Что бы получить доступ к родительскому элементу, необходимо использовать атрибут .parent .

        Taк же можно перебрать всех родителей элемента с помощью атрибута .parents .

        Изменение имен тегов HTML-документа:

        >>> soup = BeautifulSoup('

        '
        , 'html.parser') >>> tag = soup.b # присваиваем новое имя тегу >>> tag.name = "blockquote" >>> tag #
        >>> soup #

        Изменение HTML-тега

        на тег :

        >>> soup = BeautifulSoup('

        Extremely bold

        '
        , 'html.parser') >>> soup.p.name = 'div' >>> soup #
        Extremely bold

        Добавление новых тегов в HTML-документ.

        Добавление нового тега в дерево HTML:

        Добавление новых тегов до/после определенного тега или внутрь тега.

        >>> soup = BeautifulSoup("

        leave

        "
        , 'html.parser') >>> tag = soup.new_tag("i", id='new') >>> tag.string = "Don't" # добавление нового тега до тега >>> soup.b.insert_before(tag) >>> soup.b #

        Don'tleave

        # добавление нового тега после тега >>> soup.b.insert_after(tag) >>> soup #

        leaveDon't

        # добавление нового тега внутрь тега >>> soup.b.string.insert_before(tag) >>> soup.b #

        Don'tleave

        Удаление и замена тегов в HTML-документе.

        Удаляем тег или строку из дерева HTML:

        >>> html = 'I linked to example.com' >>> soup = BeautifulSoup(html, 'html.parser') >>> a_tag = soup.a # удаляем HTML-тег `` с сохранением # в переменной `i_tag` >>> i_tag = soup.i.extract() # смотрим что получилось >>> a_tag # I linked to >>> i_tag # example.com 

        Заменяем тег и/или строку в дереве HTML:

        >>> html = 'I linked to example' >>> soup = BeautifulSoup(html, 'html.parser') >>> a_tag = soup.a # создаем новый HTML тег >>> new_tag = soup.new_tag("b") >>> new_tag.string = "sample" # производим замену тега `` внутри тега `` >>> a_tag.i.replace_with(new_tag) >>> a_tag # I linked to sample 

        Изменение атрибутов тегов HTML-документа.

        У тега может быть любое количество атрибутов. Тег имеет атрибут id , значение которого равно boldest . Доступ к атрибутам тега можно получить, обращаясь с тегом как со словарем:

        >>> soup = BeautifulSoup('

        , 'html.parser') >>> tag = soup.b >>> tag['id'] # 'boldest' # доступ к словарю с атрибутами >>> tag.attrs #

        Можно добавлять и изменять атрибуты тега.

        # изменяем `id` >>> tag['id'] = 'bold' # добавляем несколько значений в `class` >>> tag['class'] = ['new', 'bold'] # или >>> tag['class'] = 'new bold' >>> tag # А так же производить их удаление.
        >>> del tag['id'] >>> del tag['class'] >>> tag # bolder >>> tag.get('id') # None 
        • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
        • Основной объект Tag() модуля BeautifulSoup4
        • Методы .find_all() и .find*() модуля BeautifulSoup4
        • CSS селекторы и модуль BeautifulSoup4
        • Метод .get_text() модуля BeautifulSoup4
        • Разбор части документа в BeautifulSoup4 Python
        • Ошибки при чтении и разборе HTML модулем BeautifulSoup4

        beautifulsoup4 4.12.2

        Beautiful Soup is a library that makes it easy to scrape information from web pages. It sits atop an HTML or XML parser, providing Pythonic idioms for iterating, searching, and modifying the parse tree.

        Quick start

        >>> from bs4 import BeautifulSoup >>> soup = BeautifulSoup("

        SomebadHTML") >>> print(soup.prettify())

        Some bad HTML

        >>> soup.find(text="bad") 'bad' >>> soup.i HTML # >>> soup = BeautifulSoup("SomebadXML", "xml") # >>> print(soup.prettify()) Some bad XML

        Links

        • Homepage
        • Documentation
        • Discussion group
        • Development
        • Bug tracker
        • Complete changelog

        Note on Python 2 sunsetting

        Beautiful Soup’s support for Python 2 was discontinued on December 31, 2020: one year after the sunset date for Python 2 itself. From this point onward, new Beautiful Soup development will exclusively target Python 3. The final release of Beautiful Soup 4 to support Python 2 was 4.9.3.

        Supporting the project

        If you use Beautiful Soup as part of your professional work, please consider a Tidelift subscription. This will support many of the free software projects your organization depends on, not just Beautiful Soup.

        If you use Beautiful Soup for personal projects, the best way to say thank you is to read Tool Safety, a zine I wrote about what Beautiful Soup has taught me about software development.

        Building the documentation

        The bs4/doc/ directory contains full documentation in Sphinx format. Run make html in that directory to create HTML documentation.

        Running the unit tests

        Beautiful Soup supports unit test discovery using Pytest:

        $ pytest 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *