BeautifulSoup

Поиск детских узлов с помощью красивого супа

Поиск детских узлов с помощью красивого супа
Задача веб-парсинга - это та, которая требует понимания того, как структурированы веб-страницы. Чтобы получить необходимую информацию с веб-страниц, нужно понимать структуру веб-страниц, анализировать теги, содержащие необходимую информацию, а затем атрибуты этих тегов.

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

Эта статья предназначена для программистов, аналитиков данных, ученых или инженеров, которые уже обладают навыками извлечения контента с веб-страниц с помощью BeautifulSoup. Если вы не знакомы с этой библиотекой, советую пройти обучение BeautifulSoup для начинающих.

Теперь мы можем продолжить - я хочу верить, что у вас уже установлена ​​эта библиотека.  Если нет, вы можете сделать это с помощью следующей команды:

pip установить BeautifulSoup4

Поскольку мы работаем с извлечением данных из HTML, нам нужна базовая HTML-страница, чтобы практиковать эти концепции на.  В этой статье мы будем использовать этот фрагмент HTML для практики. Я собираюсь назначить следующий фрагмент HTML переменной, используя тройные кавычки в Python.

sample_content = "" "

LinuxHint



Для создания неупорядоченного списка используется тег ul:
 




Для составления упорядоченного списка используется тег ol:
 


    Вот упорядоченный список
  1. Номер один

  2. Номер два



Linux Hint, 2018 г



"" "

Теперь, когда мы с этим разобрались, давайте перейдем к работе с библиотекой BeautifulSoup.

Мы собираемся использовать несколько методов и атрибутов, которые мы будем вызывать в нашем объекте BeautifulSoup. Однако нам нужно будет проанализировать нашу строку с помощью BeautifulSoup, а затем присвоить переменной «our_soup».

из bs4 импортировать BeautifulSoup как bso
our_soup = bso (sample_content, "lxml")

Отныне мы будем работать с переменной «our_soup» и вызывать для нее все наши атрибуты или методы.

Вкратце, если вы еще не знаете, что такое дочерний узел, это, по сути, узел (тег), который существует внутри другого узла. Например, в нашем фрагменте HTML теги li являются дочерними узлами тегов «ul» и «ol».

Вот методы, которые мы хотели бы изучить:

findChild ():

В findChild используется для поиска первого дочернего узла элементов HTML. Например, когда мы смотрим на наши теги «ol» или «ul», мы обнаруживаем в нем два дочерних тега. Однако когда мы используем findChild метод, он возвращает только первый узел как дочерний узел.

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

Возвращенный объект имеет тип BS4.элемент.Тег. Мы можем извлечь из него текст, вызвав на нем текстовый атрибут.

Вот пример:

first_child = наш_суп.найти ("тело").найти ("ол")
print (first_child.findChild ())

Приведенный выше код вернет следующее:

  • Номер один
  • Чтобы получить текст из тега, мы вызываем текст атрибут на нем.

    Нравиться:

    print (first_child.findChild ().текст)

    Чтобы получить следующий результат:

    'Номер один'
    findChildren ():

    Мы взглянули на findChild метод и увидел, как это работает. В findChildren метод работает аналогичным образом, однако, как следует из названия, он не находит только один дочерний узел, он получает все дочерние узлы в теге.

    Когда вам нужно получить все дочерние узлы в теге, findChildren метод - это путь. Этот метод возвращает все дочерние узлы в списке, вы можете получить доступ к выбранному тегу, используя его порядковый номер.

    Вот пример:

    first_child = наш_суп.найти ("тело").найти ("ол")
    print (first_child.findChildren ())

    Это вернет дочерние узлы в списке:

    [
  • Номер один
  • ,
  • Номер два
  • ]

    Чтобы получить второй дочерний узел в списке, следующий код выполнит задание:

    print (first_child.findChildren () [1])

    Чтобы получить следующий результат:

  • Номер два
  • Это все, что BeautifulSoup предоставляет, когда дело доходит до методов. Однако это еще не все. Атрибуты также могут быть вызваны в наших объектах BeautifulSoup для получения дочернего / дочернего / дочернего узла из элемента HTML.

    содержание:

    В то время как findChildren выполнил прямую работу по извлечению дочерних узлов, содержание атрибуты делают что-то немного другое.

    В содержание Атрибут возвращает список всего содержимого элемента HTML, включая дочерние узлы. Итак, когда вы звоните содержание в объекте BeautifulSoup, он вернет текст в виде строк, а узлы в тегах - в виде BS4.элемент.Тег объект.

    Вот пример:

    first_child = наш_суп.найти ("тело").найти ("ол")
    print (first_child.содержание)

    Это возвращает следующее:

    ["\ n Вот упорядоченный список \ n",
  • Номер один
  • ,
    '\ n',
  • Номер два
  • , '\ n']

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

    Чтобы получить доступ ко второму дочернему узлу, все, что нам нужно сделать, это использовать его порядковый номер, как показано ниже:

    print (first_child.содержание [3])

    Это вернет следующее:

  • Номер два
  • дети:

    Вот один атрибут, который выполняет почти то же самое, что и атрибут содержимого. Однако у него есть одно небольшое отличие, которое может иметь огромное влияние (для тех, кто серьезно относится к оптимизации кода).

    Атрибут children также возвращает текст, который идет перед дочерним узлом, сам дочерний узел и текст, который идет после дочернего узла. Разница здесь в том, что он возвращает их как генератор вместо списка.

    Давайте посмотрим на следующий пример:

    first_child = наш_суп.найти ("тело").найти ("ол")
    print (first_child.дети)

    Приведенный выше код дает следующие результаты (адрес на вашем компьютере не должен совпадать с адресом ниже):

    Как видите, он возвращает только адрес генератора. Мы могли бы преобразовать этот генератор в список.

    Мы видим это в примере ниже:

    first_child = наш_суп.найти ("тело").найти ("ол")
    print (list (first_child.дети))

    Это дает следующий результат:

    ["\ n Вот упорядоченный список \ n",
  • Номер один
  • ,
    '\ n',
  • Номер два
  • , '\ n']

    потомки:

    В то время как дети Атрибут работает для получения только содержимого внутри тега i.е. текст и узлы на первом уровне, потомки атрибут идет глубже и делает больше.

    В потомки атрибут получает весь текст и узлы, которые существуют в дочерних узлах. Таким образом, он не возвращает только дочерние узлы, он также возвращает узлы внуков.

    Помимо возврата текста и тегов, он также возвращает содержимое тегов в виде строк.

    Так же, как дети атрибут, потомки возвращает свои результаты как генератор.

    Мы видим это ниже:

    first_child = наш_суп.найти ("тело").найти ("ол")
    print (first_child.потомки)

    Это дает следующий результат:

    Как было показано ранее, мы можем затем преобразовать этот объект-генератор в список:

    first_child = наш_суп.найти ("тело").найти ("ол")
    print (list (first_child.потомки))

    Мы получили бы список ниже:

    ["\ n Вот упорядоченный список \ n",
  • Номер один
  • ,
    "Номер один", "\ n",
  • Номер два
  • , 'Number Two', '\ n']

    Заключение

    Вот и все, пять различных способов доступа к дочерним узлам в элементах HTML. Может быть и больше способов, однако с помощью методов и атрибутов, обсуждаемых в этой статье, можно получить доступ к дочернему узлу любого элемента HTML.

    Лучшие игры с командной строкой для Linux
    Командная строка - не только ваш главный союзник при использовании Linux - она ​​также может быть источником развлечений, потому что вы можете использ...
    Лучшие приложения для сопоставления геймпадов для Linux
    Если вам нравится играть в игры на Linux с помощью геймпада вместо стандартной системы ввода с клавиатуры и мыши, для вас есть несколько полезных прил...
    Полезные инструменты для геймеров Linux
    Если вам нравится играть в игры на Linux, скорее всего, вы использовали приложения и утилиты, такие как Wine, Lutris и OBS Studio, для улучшения игров...