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

Веб ползет в Python: Нырять в красивый суп

<Неделя 17: knaxack | Просмотр решения на GitHub | Неделя 19: JS Array Функции> (Изображение: … Теги с Python, WebDev, начинающими, CodeNewie.

<Неделя 17: рюкзак |. Просмотр решения на GitHub |. Неделя 19: JS Array Функции>

(Изображение: food.com)

Какой красивый суп? Что-то твоя мама заставляет тебя в холодный день января? Я надеюсь, что это так. Красивый суп – это веб-библиотека Python Web, и, однако, сложно, что вы думали, что веб-соскоб будет, красивый суп делает его намного проще. Например, я использовал его на одном проект Когда я должен был соскрести веб-сайт Genius, так как их API на самом деле не предоставляет песни песен (я знаю правильно? У вас была одна работа, гений).

Давайте посмотрим на образец вопрос технического интервью:

# Crawl a webpage and print the most common word with 
# the count of that word.

# Page to crawl:
# https://en.wikipedia.org/wiki/Apple_Inc.

# Only words from the section "history" should be accounted for.

# Example of the expected result
#     # of occurrences
# The 205

Мы получили страницу Apple Wikipedia, и мы хотим найти самое распространенное слово в разделе «История». Так что давайте начнем.

1. Настройка и установка

Сначала нам нужно импортировать красивый суп. Установите из командной строки через PIP3 Установите BS4 (или однако у вас настроен PIP). Проверьте Документация Если у вас проблемы с установкой.

Затем давайте потребуем нашей библиотеки в верхней части кода. Вот все, что нам нужно:

from bs4 import BeautifulSoup, Tag
import requests

from collections import defaultdict

Далее мы готовы определить нашу функцию.

def find_most_common():

2. Получить страницу

Давайте получим нашу страницу и расставим его красивым супом. Чтобы получить страницу, мы используем Запросы библиотека:

  page = requests.get("https://en.wikipedia.org/wiki/Apple_Inc.")

Далее мы разбираем текст страницы, используя красивый суп.

  soup = BeautifulSoup(page.text, "html.parser")

Как мы получим только раздел истории? Мы должны взглянуть на HTML страницы. Там много случайных гибберов, которые я пытался убрать:

History

...
...

1976–1984: Founding and incorporation

. . .

Apple Computer Company was founded on April 1, 1976, by Steve Jobs...

По какой-то причине Википедия, кажется, имеет все их содержание в одном диване. Это означает, что раздел «История» не является его собственным девчом, а заголовок и некоторые вещи внутри родителей Div, который содержит все разделы. Чтобы получить только раздел истории, лучшее, что мы можем сделать сейчас, это просто захватить этот заголовок и все после него. Мы захватываем Тег с идентификатором «История», а затем пойти к своему родителю,

Отказ Чтобы получить все после этого, мы можем использовать нотацию красивой подвески, next_siblings Отказ Всего:

  history = soup.find(id="History").parent.next_siblings

3. Считайте слова

Давайте инициализируем пару переменных. Нам понадобится самое распространенное слово и количество раз появления. Мы также использовали словарь для хранения подсчета каждого слова. Если вы следуете в этом блоге, вы, наверное, догадались, что мы будем использовать DICTonary по умолчанию для этого (если вы не помните, мы можем установить тип по умолчанию по умолчанию для целых чисел. Таким образом, если мы получим доступ к ключу, которое не существует, значение по умолчанию уже 0).

  max_count = 0
  max_word = ""
  dd = defaultdict(int)

Теперь мы готовы ползти. Давайте петли через История и посмотрите на каждый элемент, Элем Отказ Однако красивый суп иногда возвращает что-то, называемое «судоходной строкой» вместо элемента. Мы отфильтровали все, что не элемент, используя Isinstance () Метод из нашей библиотеки.

  for elem in history:
    if isinstance(elem, Tag):

Давайте подумаем о том, что произойдет дальше. Нам нужно посмотреть на текст для каждого элемента в История и сосчитать экземпляр каждого слова. Однако помните, нам нужно остановиться, когда мы больше не в разделе истории. Следующий раздел такой же div, но начинается с

ярлык. Затем мы можем закончить функцию, печатая самое распространенное слово и его счет. Я вернусь max_count Отказ

  for elem in history:
    if isinstance(elem, Tag):
      if elem.name == "h2":
        print(max_word, "is the most common, appearing", max_count, "times.")
        return max_count

Но что, если это не конец раздела? Нам нужно получить текст, позвонив на красивую подпись get_text () Метод, а затем разделить его словами, позвонив Сплит () на каждом пространстве.

      words = elem.get_text().split()

Что дальше? Петли через каждое слово и обновите его счет в словаре. Поскольку мы используем словарь по умолчанию, нам не нужно проверять, если слово уже там перед добавлением 1 к нему. Кроме того, не забудьте обновить max_word и max_count Если мы найдем слово более распространено, чем то, что мы имели ранее.

      for word in words:
        dd[word] += 1
        if dd[word] > max_count:
          max_count = dd[word]
          max_word = word 

Вот и все! Код должен работать … Если Wikipedia не изменит макет их сайта. Давайте добавим окончательную проверку в конце в случае, если произойдет. Всего:

from bs4 import BeautifulSoup, Tag
import requests

from collections import defaultdict

def find_most_common():
  page = requests.get("https://en.wikipedia.org/wiki/Apple_Inc.")
  soup = BeautifulSoup(page.text, "html.parser")
  history = soup.find(id="History").parent.next_siblings
  max_count = 0
  max_word = ""
  dd = defaultdict(int)

  for elem in history:
    if isinstance(elem, Tag):
      if elem.name == "h2":
        print(max_word, "is the most common, appearing", max_count, "times.")
        return max_count
      words = elem.get_text().split()
      for word in words:
        dd[word] += 1
        if dd[word] > max_count:
          max_count = dd[word]
          max_word = word

  return "Error"

Попробуйте это

Эта функция печатает результат, поэтому мы можем просто запустить его с find_most_common () Отказ Запуск кода дает нам результат:

the is the most common, appearing 328 times.

И там у вас есть! Уважаемый, эта функция работает только для этой конкретной страницы, на момент написания этого – главная проблема с веб-ползуностью состоит в том, что она может сломаться, если владелец сайта изменяет их содержание в малейшей моде. Мы также не учитываем корпус или пунктуацию, то, что вы можете попробовать, реализовать самостоятельно. Просто несколько вещей, о которых нужно подумать. Увидимся в следующий раз!

<Неделя 17: рюкзак |. Просмотр решения на GitHub |. Неделя 19: JS Array Функции>

Sheamus Heikkila ранее преподавательский помощник на Генеральной Ассамблее. Этот блог не связан с GA.

Оригинал: “https://dev.to/pythonwb/web-crawling-in-python-dive-into-beautiful-soup-4bdd”