Парсинг HTML за допомогою Python

Як парсити HTML за допомогою Python

This time, I’ll walk you through how to parse HTML using three popular tools: BeautifulSoup, lxml, and html.parser. Each one has its unique advantages, and I’ll show you how to get the most out of each. Whether you’re just starting or looking to refine your skills, these tools will make HTML parsing straightforward and efficient. Let’s dive in!

Навіщо розбирати HTML?

Перш ніж переходити до інструментів і коду, спершу розберімося, чому парсинг HTML взагалі потрібен. Коли ви відкриваєте вебсторінку, усе, що ви бачите, структуровано за допомогою HTML-тегів. Ці теги визначають заголовки, абзаци, зображення, посилання та інші елементи. Якщо вам потрібно витягнути з вебсторінки певну інформацію, наприклад заголовок, ціни на товари або відгуки, слід звернутися до HTML-структури, щоб знайти ці дані. Водночас ручний перегляд HTML може бути виснажливим, особливо для великих або численних вебсторінок. Саме тут стають у пригоді інструменти для парсингу, які автоматизують пошук і витягування потрібних даних.

Skip Manual Parsing

Ви можете легко обійти ручний вебскрапінг, обравши API для вебскрапінгу або постачальника датасетів для всіх ваших потреб у даних. Ось деякі з найкращих постачальників вебданих:

  1. Bright Data: Потужний вебскрапінг на основі проксі для складних завдань.
  2. ScraperAPI: Доступна багатомовна підтримка для незахищених сайтів.
  3. Oxylabs: Високоякісні проксі, парсинг даних на основі ШІ.

Для повного списку перейдіть за посиланням моя стаття про найкращі API для вебскрапінгу.

Інструменти для парсингу HTML у Python

Python has several libraries that can handle HTML parsing. Each library has its own advantages and use cases. Below, we will look at three popular ones: BeautifulSoup, lxml, and html.parser.

BeautifulSoup

BeautifulSoup — одна з найпопулярніших бібліотек Python для розбору HTML і XML. Вона спрощує вилучення даних із вебсторінок, даючи змогу швидко орієнтуватися в структурі HTML і отримувати потрібну інформацію.

Installation:

Перш ніж використовувати BeautifulSoup, його потрібно встановити. Це можна зробити за допомогою pip, менеджера пакетів Python:

pip install beautifulsoup4

Крім того, BeautifulSoup часто добре працює з бібліотекою requests, яка дає змогу легко отримувати HTML-вміст вебсторінки:

pip install requests

Як використовувати BeautifulSoup:

Let’s start with an example of how to use BeautifulSoup to parse HTML. In this case, we will extract the title of a webpage.

import requests
from bs4 import BeautifulSoup
# Fetch the HTML content of the webpage
url = "https://example.com"
response = requests.get(url)
# Parse the HTML content using BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
# Extract the title of the webpage
title = soup.title.text
print("Заголовок сторінки:", title)

У цьому коді:

  • We use requests.get to fetch the webpage’s HTML.
  • BeautifulSoup використовується для розбору HTML-вмісту.
  • We then extract the title of the page using soup.title.

Навігація HTML-структурою:

Після того як ви розпарсите HTML, ви можете переходити по ньому, використовуючи різні методи, які надає BeautifulSoup. Наприклад:

  • soup.find allows you to find the first occurrence of an HTML tag.
  • soup.find_all returns a list of all occurrences of a particular tag.

Let’s see how you can extract all the links (<a> tags) from a webpage:

links = soup.find_all(‘a’)

for link in links:

print(link.get('href'))

Цей код виведе всі гіперпосилання (URL), знайдені на вебсторінці.

lxml

Бібліотека lxml — це ще один потужний інструмент для парсингу HTML і XML у Python. Вона відома своєю швидкістю та точністю. Якщо продуктивність є пріоритетом, lxml може бути кращим вибором, ніж BeautifulSoup.

Installation:

Щоб встановити lxml, можна скористатися pip:

pip install lxml

Як використовувати lxml:

Ось приклад того, як парсити HTML за допомогою lxml:

from lxml import html
import requests
# Fetch the HTML content
url = "https://example.com"
response = requests.get(url)
# Parse the HTML content using lxml
tree = html.fromstring(response.content)
# Extract the title of the webpage
title = tree.findtext('.//title')
print("Заголовок сторінки:", title)

У цьому прикладі:

  • Ми використовуємо модуль html з lxml для розбору вмісту вебсторінки.
  • The findtext function retrieves the text inside the <title> tag.

XPath у lxml:

Однією з ключових можливостей XML є підтримка XPath — потужної мови запитів до XML- і HTML-документів. XPath дає змогу працювати з HTML-документом гнучкіше, ніж стандартний пошук за тегами.

Ось приклад того, як використовувати XPath для вилучення всіх посилань із вебсторінки:

# Extract all links using XPath
links = tree.xpath('//a/@href')
for link in links:
print(link)

This code uses the XPath expression //a/@href to find all the <a> tags and extract the value of their href attributes (which contain the URLs).

html.parser

Python’s built-in html.parser module is another option for parsing HTML. While it may not be as fast or feature-rich as BeautifulSoup or lxml, it is still a valid option for basic tasks, and it doesn’t require any additional installation since it is part of Python’s standard library.

How to Use html.parser:

Here’s an example of how to parse a webpage using html.parser:

from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("Start tag:", tag)
def handle_endtag(self, tag):
print("End tag:", tag)
def handle_data(self, data):
print("Data:", data)
# Sample HTML to parse
html_content = """
<html>
<head><title>Example</title></head>
<body><p>Hello, world!</p></body>
</html>
"""
# Create an instance of the parser and feed it the HTML content
parser = MyHTMLParser()
parser.feed(html_content)

У цьому прикладі:

  • Ми успадковуємо HTMLParser, щоб створити наш власний парсер.
  • The handle_starttag, handle_endtag, and handle_data methods are overridden to handle different parts of the HTML content.

Цей парсер виводитиме інформацію про початкові теги, кінцеві теги та дані між тегами.

Порівняння бібліотек

Тепер, коли ми розглянули три різні інструменти для парсингу HTML, порівняймо їх, щоб зрозуміти їхні сильні та слабкі сторони.

BeautifulSoup:

  • Простота використання: Його надзвичайно легко використовувати, навіть для початківців.
  • Flexibility: Дає змогу виконувати як прості, так і складні завдання парсингу.
  • Performance: Не такий швидкий, як lxml, особливо для великих документів.

lxml:

  • Speed: Одна з найшвидших бібліотек для парсингу HTML.
  • Accuracy: Дуже точний, особливо під час роботи з некоректно сформованим HTML.
  • XPath Support: Дозволяє виконувати складні запити за допомогою XPath.

html.parser:

  • Built-in: No need for external libraries; it comes with Python.
  • Basic Parsing: Підходить для простих завдань парсингу, але не має потужності та гнучкості BeautifulSoup і lxml.

Вибір правильного інструмента

Найкращий інструмент для парсингу HTML залежить від ваших конкретних потреб:

  • If you need something quick and simple, and you don’t want to install additional libraries, html.parser is a good option.
  • Якщо ви працюєте з великими, складними документами або вам потрібна висока продуктивність, lxml, імовірно, буде найкращим вибором.
  • Якщо вам потрібна зручна у використанні, універсальна бібліотека з широкою підтримкою спільноти, BeautifulSoup є чудовим варіантом.

Advanced Parsing Techniques

Для складніших сценаріїв використання може знадобитися поєднувати ці бібліотеки з іншими інструментами. Наприклад:

  • Ви можете використовувати BeautifulSoup для зручної навігації HTML-структурою та поєднувати його з requests для отримання даних із динамічних вебсайтів.
  • Якщо вам потрібно взаємодіяти з вебсайтами, які використовують JavaScript для завантаження вмісту, може знадобитися використати інструменти на кшталт Selenium або Playwright, щоб спочатку відрендерити сторінку, а потім розібрати HTML.

Ось приклад використання BeautifulSoup із Selenium для вебскрапінгу динамічного контенту:

from selenium import webdriver
from bs4 import BeautifulSoup
# Set up the Selenium driver (ensure you have a driver like ChromeDriver installed)
driver = webdriver.Chrome()
# Open the webpage
url = "https://example.com"
driver.get(url)
# Get the page source after JavaScript has loaded the content
html_content = driver.page_source
# Parse the HTML using BeautifulSoup
soup = BeautifulSoup(html_content, "html.parser")
# Extract the title
title = soup.title.text
print("Заголовок сторінки:", title)
# Close the Selenium driver
driver.quit()

У цьому коді:

  • Selenium використовують, щоб відкрити вебсторінку й дозволити виконання JavaScript.
  • BeautifulSoup використовують для парсингу HTML-вмісту та вилучення потрібних даних.

Conclusion

Parsing HTML is a vital skill when working with web scraping, data extraction, or automation projects. Python provides several powerful libraries, such as BeautifulSoup, lxml, and html.parser, which make this task straightforward. Depending on your project requirements, you can choose the library that best fits your needs. BeautifulSoup is great for beginners and quick projects, while lxml offers speed and powerful XPath support for more complex tasks. The built-in html.parser is suitable for simpler needs and when you want to avoid external dependencies.

Розуміючи сильні сторони кожного інструмента та спосіб їх використання, ви зможете ефективно парсити HTML і витягувати потрібні дані з вебсторінок.

Схожі записи