Рубрики
Без рубрики

BeautifulSoupsooup So 2000-and-appy: Web Scraping в 2020 году

Beautifulsoup (BS4) был создан в течение десятилетия – а-х года назад. И это был стандарт для Web Scra … Помечено Python, веб-соскоб, гаспачо, Хактоберфест.

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)

Сделать все легче читать:

Газпачо быстро Это займет всего 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”