Красивый суп - виды предметов

Когда мы передаем html-документ или строку конструктору beautifulsoup, beautifulsoup в основном преобразует сложную html-страницу в различные объекты Python. Ниже мы обсудим четыре основных типа объектов:

  • Tag

  • NavigableString

  • BeautifulSoup

  • Comments

Объекты тегов

Тег HTML используется для определения различных типов содержимого. Объект тега в BeautifulSoup соответствует тегу HTML или XML на реальной странице или в документе.

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<b class="boldest">TutorialsPoint</b>')
>>> tag = soup.html
>>> type(tag)
<class 'bs4.element.Tag'>

Теги содержат множество атрибутов и методов, а двумя важными особенностями тега являются его имя и атрибуты.

Имя (tag.name)

Каждый тег содержит имя и доступен через суффикс .name. tag.name вернет тип тега.

>>> tag.name
'html'

Однако, если мы изменим имя тега, это отразится в разметке HTML, созданной BeautifulSoup.

>>> tag.name = "Strong"
>>> tag
<Strong><body><b class="boldest">TutorialsPoint</b></body></Strong>
>>> tag.name
'Strong'

Атрибуты (tag.attrs)

Объект тега может иметь любое количество атрибутов. Тег <b class = ”boldest”> имеет атрибут “class”, значение которого - “boldest”. Все, что НЕ является тегом, в основном является атрибутом и должно содержать значение. Вы можете получить доступ к атрибутам либо путем доступа к ключам (например, доступ к «классу» в приведенном выше примере), либо напрямую через «.attrs»

>>> tutorialsP = BeautifulSoup("<div class='tutorialsP'></div>",'lxml')
>>> tag2 = tutorialsP.div
>>> tag2['class']
['tutorialsP']

Мы можем вносить любые изменения в атрибуты нашего тега (добавлять / удалять / изменять).

>>> tag2['class'] = 'Online-Learning'
>>> tag2['style'] = '2007'
>>>
>>> tag2
<div class="Online-Learning" style="2007"></div>
>>> del tag2['style']
>>> tag2
<div class="Online-Learning"></div>
>>> del tag['class']
>>> tag
<b SecondAttribute="2">TutorialsPoint</b>
>>>
>>> del tag['SecondAttribute']
>>> tag
</b>
>>> tag2['class']
'Online-Learning'
>>> tag2['style']
KeyError: 'style'

Многозначные атрибуты

Некоторые атрибуты HTML5 могут иметь несколько значений. Чаще всего используется атрибут класса, который может иметь несколько значений CSS. Другие включают "rel", "rev", "headers", "accesskey" и "accept-charset". Многозначные атрибуты красивого супа представлены в виде списка.

>>> from bs4 import BeautifulSoup
>>>
>>> css_soup = BeautifulSoup('<p class="body"></p>')
>>> css_soup.p['class']
['body']
>>>
>>> css_soup = BeautifulSoup('<p class="body bold"></p>')
>>> css_soup.p['class']
['body', 'bold']

Однако, если какой-либо атрибут содержит более одного значения, но он не является многозначным атрибутом любой версии стандарта HTML, красивый суп оставит атрибут в покое -

>>> id_soup = BeautifulSoup('<p id="body bold"></p>')
>>> id_soup.p['id']
'body bold'
>>> type(id_soup.p['id'])
<class 'str'>

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

>>> rel_soup = BeautifulSoup("<p> tutorialspoint Main <a rel='Index'> Page</a></p>")
>>> rel_soup.a['rel']
['Index']
>>> rel_soup.a['rel'] = ['Index', ' Online Library, Its all Free']
>>> print(rel_soup.p)
<p> tutorialspoint Main <a rel="Index Online Library, Its all Free"> Page</a></p>

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

id_soup.p.get_attribute_list(‘id’)

Однако, если вы проанализируете документ как 'xml', многозначных атрибутов нет -

>>> xml_soup = BeautifulSoup('<p class="body bold"></p>', 'xml')
>>> xml_soup.p['class']
'body bold'

NavigableString

Объект navigablestring используется для представления содержимого тега. Для доступа к содержимому используйте «.string» с тегом.

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>>
>>> soup.string
'Hello, Tutorialspoint!'
>>> type(soup.string)
>

Вы можете заменить строку другой строкой, но не можете редактировать существующую строку.

>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>> soup.string.replace_with("Online Learning!")
'Hello, Tutorialspoint!'
>>> soup.string
'Online Learning!'
>>> soup
<html><body><h2 id="message">Online Learning!</h2></body></html>

BeautifulSoup

BeautifulSoup - это объект, который создается, когда мы пытаемся очистить веб-ресурс. Итак, это полный документ, который мы пытаемся очистить. В большинстве случаев это объект тега.

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>> type(soup)
<class 'bs4.BeautifulSoup'>
>>> soup.name
'[document]'

Комментарии

Объект комментария иллюстрирует часть комментария веб-документа. Это просто особый тип NavigableString.

>>> soup = BeautifulSoup('<p><!-- Everything inside it is COMMENTS --></p>')
>>> comment = soup.p.string
>>> type(comment)
<class 'bs4.element.Comment'>
>>> type(comment)
<class 'bs4.element.Comment'>
>>> print(soup.p.prettify())
<p>
<!-- Everything inside it is COMMENTS -->
</p>

Объекты NavigableString

Объекты navigablestring используются для представления текста внутри тегов, а не самих тегов.