BeautifulSoup — примеры использования
BeautifulSoup является библиотекой Python для парсинга HTML и XML документов. Часто используется для скрапинга веб-страниц. BeautifulSoup позволяет трансформировать сложный HTML-документ в сложное древо различных объектов Python. Это могут быть теги, навигация или комментарии.
Установка BeautifulSoup в Python
Для установки необходимых модулей используется команда pip3.
$ sudo pip3 install lxml
Для начала требуется установить lxml модуль, который используется в BeautifulSoup.
$ sudo pip3 install bs4
BeautifulSoup устанавливается при помощи использования указанной выше команды.
Пример HTML-кода страницы
В последующих примерах будет использован данный HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Header</title>
<meta charset="utf-8">
</head>
<body>
<h2>Operating systems</h2>
<ul id="mylist" style="width:150px">
<li>Solaris</li>
<li>FreeBSD</li>
<li>Debian</li>
<li>NetBSD</li>
<li>Windows</li>
</ul>
<p>
FreeBSD is an advanced computer operating system used to
power modern servers, desktops, and embedded platforms.
</p>
<p>
Debian is a Unix-like computer operating system that is
composed entirely of free software.
</p>
</body>
</html>
BeautifulSoup простой пример парсинга HTML
В первом примере будет использован BeautifulSoup модуль для получения трех тегов.
#!/usr/bin/python3
from bs4 import BeautifulSoup
with open("index.html", "r") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'lxml')
print(soup.h2)
print(soup.head)
print(soup.li)
Код в данном примере позволяет вывести HTML-код трех тегов.
from bs4 import BeautifulSoup
Здесь производится импорт класса BeautifulSoup из модуля bs4. Таким образом, BeautifulSoup является главным рабочим классом.
with open("index.html", "r") as f:
contents = f.read()
Открывается файл index.html и производится чтение его содержимого при помощи метода read().
soup = BeautifulSoup(contents, 'lxml')
Создается объект BeautifulSoup. Данные передаются конструктору. Вторая опция уточняет объект парсинга.
print(soup.h2) print(soup.head)
Далее выводится HTML-код следующих двух тегов: h2 и head.
print(soup.li)
В примере много раз используются элементы li, однако выводится только первый из них.
$ ./simple.py <h2>Operating systems</h2> <head> <title>Header</title> <meta charset="utf-8"/> </head> <li>Solaris</li>
Это результат вывода.
BeautifulSoup теги, атрибуты name и text
Атрибут name указывает на название тега, а атрибут text указывает на его содержимое.
#!/usr/bin/python3
from bs4 import BeautifulSoup
with open("index.html", "r") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'lxml')
print("HTML: {0}, name: {1}, text: {2}".format(soup.h2,
soup.h2.name, soup.h2.text))
Код в примере позволяет вывести HTML-код, название и текст h2 тега.
$ ./tags_names.py HTML: <h2>Operating systems</h2>, name: h2, text: Operating systems
Это результат вывода.
BeautifulSoap перебираем HTML теги
Метод recursiveChildGenerator() позволяет перебрать содержимое HTML-документа.
#!/usr/bin/python3
from bs4 import BeautifulSoup
with open("index.html", "r") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'lxml')
for child in soup.recursiveChildGenerator():
if child.name:
print(child.name)
Данный пример позволяет перебрать содержимое HTML-документа и вывести названия всех его тегов.
$ ./traverse_tree.py html head title meta body h2 ul li li li li li p p
Данные теги являются частью рассматриваемого HTML-документа.
BeautifulSoup атрибут children
При помощи атрибута children можно вывести все дочерние теги.
#!/usr/bin/python3
from bs4 import BeautifulSoup
import requests as req
resp = req.get("http://www.something.com")
soup = BeautifulSoup(resp.text, 'lxml')
print(soup.title)
print(soup.title.text)
print(soup.title.parent)
Данный пример извлекает название рассматриваемой веб-страницы. Здесь также выводится имя ее родителя.
resp = req.get("http://www.something.com")
soup = BeautifulSoup(resp.text, 'lxml')
Здесь мы получаем информацию о веб-странице.
print(soup.title) print(soup.title.text) print(soup.title.parent)
Код выше помогает вывести HTML-код заголовка, его текст, а также HTML-код его родителя.
$ ./scraping.py <title>Something.</title> Something. <head><title>Something.</title></head>
Это результат вывода.
BeautifulSoup метод prettify()
При помощи метода prettify() можно добиться того, чтобы HTML-код выглядел аккуратнее.
#!/usr/bin/python3
from bs4 import BeautifulSoup
import requests as req
resp = req.get("http://www.something.com")
soup = BeautifulSoup(resp.text, 'lxml')
print(soup.prettify())
Таким образом, мы оптимизируем HTML-код простой веб-страницы.
$ ./prettify.py <html> <head> <title> Something. </title> </head> <body> Something. </body> </html>
Это результат вывода.
BeautifulSoup метод find(), поиск элементов по id
При помощи метода find() можно найти элементы страницы, используя различные опорные параметры, id в том числе.
#!/usr/bin/python3
from bs4 import BeautifulSoup
with open("index.html", "r") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'lxml')
#print(soup.find("ul", attrs={ "id" : "mylist"}))
print(soup.find("ul", id="mylist"))
Код в примере находит тег ul, у которого id mylist. Строка в комментарии является альтернативным способом выполнить то же самое задание.
BeautifulSoup метод find_all() поиск всех тегов в HTML
При помощи метода find_all() можно найти все элементы, которые соответствуют заданным критериям.
В примере показано, как при помощи метода find() найти определенный элемент, а затем, используя метод replace_with(), заменить его содержимое.
BeautifulSoup метод decompose() удаление HTML-тега
Метод decompose() удаляет определенный тег из структуры документа и уничтожает его.
#!/usr/bin/python3
from bs4 import BeautifulSoup
with open("index.html", "r") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'lxml')
ptag2 = soup.select_one("p:nth-of-type(2)")
ptag2.decompose()
print(soup.body.prettify())
В данном примере показано, как удалить второй элемент p в документе.
источник python-scripts.com


















