BeautifulSoup ( BS4
) был создан над десятилетие с половиной тому назад. И это было Стандарт Для веб-стеска с соскабливания. Но пришло время для чего-то нового, потому что BS4
это так 2000 и поздний Отказ
В этом посте мы рассмотрим 10 причин Почему Газпачо Является ли будущее веб-соскоба, выскабливая части этого поста!
Газпачо
Установлен в командной строке:
pip install gazpacho
Без дополнительных зависимостей:
pip freeze # gazpacho==1.1
Напротив, BS4
упакован с суп
и lxml.
. Я не скажу вам, как писать программное обеспечение, но минимизация зависимостей обычно является хорошая идея …
HTML для этого поста в блоге может быть выбрано и сделан для анализа с Суп.get
:
from gazpacho import Soup url = "https://dev.to/maxhumber/beautifulsoup-is-so-2000-and-late-web-scraping-in-2020-2528" soup = Soup.get(url)
К сожалению, вам понадобится Запросы
на вершине BS4
сделать то же самое:
import requests from bs4 import BeautifulSoup url = "https://dev.to/maxhumber/beautifulsoup-is-so-2000-and-late-web-scraping-in-2020-2528" html = requests.get(url).text bsoup = BeautifulSoup(html)
3. Простое выяснение
BS4
это монстр. Есть 184 Методы и атрибуты, прикрепленные к каждому Beautifulsoup
объект. Сделать трудно знать, что использовать и когда его использовать:
len(dir(BeautifulSoup())) # 184
Напротив, Суп
Объекты в Газпачо
просты; Есть только семь методов и атрибутов, чтобы отслеживать:
[method for method in dir(Soup())] # ['attrs', 'find', 'get', 'html', 'strip', 'tag', 'text']
Глядя на этот список, ясно, что найти название этого поста (вложенный внутри H1
Tag), например, нам нужно будет использовать .find
:
soup.find('h1')
Газпачо
Потрясающе для прототипирования и даже лучше для производства. По умолчанию .find
вернется один Суп
Объект, если он находит только один элемент или список Суп
Объекты, если он находит более одного.
Чтобы гарантировать и обеспечить соблюдение типов возврата в производстве Режим =
Аргумент в .find
Может быть установлен вручную:
title = (soup .find("header", {'id': 'main-title'}, mode="first") .find("h1", mode="all")[0] .text )
Напротив, BS4
есть 27 Найти методы, и все они возвращают что-то другое:
[method for method in dir(BeautifulSoup()) if 'find' in method]
Как Версия 1.1 , Газпачо
это PEP 561 Соответствует. Это означает, что напечатана вся библиотека и будет работать с вашим типизированным (или стандартным уткой/неинтересной!).
help(soup.find) # Signature: # soup.find( # tag: str, # attrs: Union[Dict[str, Any], NoneType] = None, # *, # partial: bool = True, # mode: str = 'automatic', # strict: Union[bool, NoneType] = None, # ) -> Union[List[ForwardRef('Soup')], ForwardRef('Soup'), NoneType]
HTML на dev.to и этот пост хорошо отформатирован. Но Если это не было:
header = soup.find("div", {'class': 'crayons-article__header__meta'}) html = str(header.find("div", {'class': 'mb-4 spec__tags'})) bad_html = html.replace("\n", "") # remove new line characters print(bad_html) #
Газпачо
сможет автоматически форматировать и отступать в плохом/злобном HTML:
tags = Soup(bad_html)
Сделать все легче читать:
print(tags) #
Газпачо
быстро Это займет всего 258 мкс, чтобы соскрести ссылки на тег для этого поста:
%%timeit tags = Soup(bad_html) tags = tags.find("a") tag_links = ["https://dev.to" + tag.attrs['href'] for tag in tags] # 258 µs ± 10.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
В то время как BS4
занимает почти вдвое больше, чтобы сделать то же самое:
%%timeit tags = BeautifulSoup(bad_html) tags = tags.find_all("a") tag_links = ["https://dev.to" + tag.attrs['href'] for tag in tags] # 465 µs ± 2.61 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Газпачо
может частично соответствовать атрибутам HTML-элемента. Например, боковая панель для этой страницы отображается со следующим HTML:
И может быть совпадающим точно с:
soup.find("aside", {"class": "crayons-layout__sidebar-right"}, partial=False)
Или частично (поведение по умолчанию) с:
sidebar = soup.find("aside", {'aria-label': 'Right sidebar'}, partial=True) # finding my name sidebar.find("span", {'class': 'crayons-subtitle-2'}, partial=True).text
Gazpacho – Python 3 первым, Черный , напечатанный Marpy и около ~ 400 SLOC. Легко прочитать через источник:
import inspect source = inspect.getsource(Soup.find) print(source)
И как BS4
не пронизывается Питон 2 Технический долг Отказ
Самое главное, Газпачо
Является ли открытым источником, размещенным на Github (вместо некоторых Clunky Custom Platform ) и искать участников.
Если вы участвуете в #hacktoberfest, мы хотели бы у вас. Есть пара Открытые проблемы Это может использовать некоторую помощь!
Оригинал: “https://dev.to/maxhumber/beautifulsoup-is-so-2000-and-late-web-scraping-in-2020-2528”