Библиотека быстрого анализа данных сканера: BeautifulSoup4

рептилия
Библиотека быстрого анализа данных сканера: BeautifulSoup4

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Быстрый старт

Всем привет, меня зовут Питер~

Сегодня я привожу статью о библиотеке для анализа данных краулером.

Beautiful Soup— это библиотека Python, которая может извлекать данные из файлов HTML или XML. Поскольку BeautifulSoup основан на Python, он относительно медленнее, чем другой Xpath, но его функция также очень мощная.Эта статья расскажет об основном использовании библиотеки, чтобы помочь читателям быстро начать работу.

Учебных материалов в Интернете много, но сверхподробным учебным контентом остается официальный сайт, портал данных

Английский официальный сайт:woohoo.crummy.com/software/be…

Официальный китайский сайт:woohoo.crummy.com/software/be…

установить и использовать

Установить

Процесс установки очень прост, просто используйте pip напрямую:

pip install beautifulsoup4

Последние 4 из вышеперечисленных установочных библиотек нельзя опускать, т.к. есть еще одна библиотека с названием beautifulsoup, но эта библиотека остановлена ​​в разработке.

Поскольку BS4 должен полагаться на определенный синтаксический анализатор при анализе данных, ему также необходимо установить синтаксический анализатор.Мы устанавливаем мощный lxml:

pip install lxml

Импортируйте библиотеку в интерактивную среду python.Если об ошибке не сообщается, установка выполнена успешно.

использовать

Импортируйте библиотеку напрямую, используя процедуру:

from bs4 import BeautifulSoup

Принцип анализа

Принцип анализа

  • Создайте экземпляр объекта BeautifulSoup и загрузите локальные данные или исходные данные страницы в объект.
  • Позиционирование тегов и извлечение данных путем вызова соответствующих свойств или методов в объекте

Как создать экземпляр объекта BeautifulSoup

  1. Загрузить данные из локального HTML-документа в объект BS
  2. Загрузить исходные данные страницы, полученные на веб-странице, в объект BS

Анализ случая

необработанные данные

Предположим, теперь у нас есть HTML-файл для локального анализа. Конкретное содержимое выглядит следующим образом. В данных есть различные HTML-теги: html, head, body, div, p, a, ul, li и т. д.

Скачать данные

from bs4 import BeautifulSoup

fp = open('./test.html','r',encoding='utf-8')  # 打开本地文件
soup = BeautifulSoup(fp,'lxml')
soup

Весь парсинг данных основан на объекте супа Начнем с различных методов парсинга данных:

soup.tagName

суп.TagName возвращает содержимое первого появления тега, взяв тег a в качестве примера:

Тег a появляется в данных несколько раз, но возвращается только первое вхождение.

Давайте снова посмотрим на тег div:

Появляется 2 раза, но возвращает содержимое только в первый раз:

soup.find('tagName')

find() в основном имеет два метода:

  • Возвращает первое вхождение тега, эквивалентного супу.tagName выше.
  • Позиционирование атрибута: используется для поиска тега с определенным свойством.

1. Вернуть содержимое первого вхождения метки:

Например, верните содержимое первого вхождения тега a:

Другой пример — вернуть содержимое первого вхождения тега div:

2. Позиционирование атрибутов

Например, мы хотим найти информацию о данных с идентификатором «Google» в теге a:

В BS4 оговорено, что если вам нужно запросить class, вам нужно вместо этого использовать class_:

Но если мы используем параметр attrs, нет необходимости использовать символы подчеркивания:

soup.find_all()

Этот метод возвращает весь контент под указанной меткой, и он в виде списка, есть разные способы передачи.

1. Передать один указанный тег

image-20210523170401516

Приведенное выше возвращается в виде списка, мы можем получить то, что хотим:

2. Входящие множественные теги (форма списка)

Нужно в основном возвращать выражение содержимого, а содержимое каждой метки выводится отдельно

3. Входящее регулярное выражение

Например, чтобы просмотреть все содержимое тегов, начинающихся с

Посмотреть все, что начинается с тега li:

селектор суп.выбрать()

В основном есть 3 селектора, и возвращаемый контентсписокформа

  • селектор класса: точка
  • селектор идентификатора: #
  • Селектор тегов: укажите имя тега напрямую

1. Селектор класса

2. селектор идентификатора

3. Селектор тегов

Укажите тег li напрямую

4. Селектор и find_all() могут добиться того же эффекта:

Эффект супа.имя_тега и супа.найти('имя_тега') также одинаков:

Использование иерархического селектора

В методе soap.select() можно использовать иерархические селекторы.Селекторами могут быть классы, идентификаторы, теги и т. д., используя правила:

  • Один слой:>
  • Несколько слоев: пробелы

1. Однослойное использование

2. Многослойное использование

Получить текстовое содержимое ярлыка

Получение соответствующего текстового содержимого в теге — это в основном два атрибута + один метод:

  • text
  • string
  • get_text()

1. текст

2. строка

3. получить_текст()

Разница между 3

# text和get_text():获取标签下面的全部文本内容
# string:只能获取到标签下的直系文本内容

Получить значение атрибута тега

1. Пройдите через селектор

2. Получен методом find_all

BeautifulSoup в действии

Ниже описано, как получить имя и соответствующий URL-адрес романа Гулонга на веб-сайте романа с помощью метода синтаксического анализа BeautifulSoup.

данные веб-сайта

Все данные, которые нам нужно сканировать, находятся по этому URL-адресу:воооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооу

Каждая строка из 3 романов находится под тегом tr, а соответствующие атрибуты href и текстовое содержимое — это содержимое, которое мы хотим извлечь.

Получить исходный код веб-страницы

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re

url = 'https://www.kanunu8.com/zj/10867.html'
headers = {'user-agent': '个人请求头'}

response = requests.get(url = url,headers = headers)
result = response.content.decode('gbk')   # 该网页需要通过gbk编码来解析数据
# result

Создайте экземпляр объекта BeautifulSoup

soup1 = BeautifulSoup(result,'lxml')
# print(soup1.prettify())  美化输出源码内容

Получить имя и URL-адрес

1. Сначала получите общий контент

Все две части информации указаны в теге a, нам нужно только получить тег a, который можно заблокировать через два атрибута href и target:

# 两个属性href和target,不同的方法来锁定

information_list = soup1.find_all('a',href=re.compile('^/book'),target='_blank')
information_list

2. Получите две части информации отдельно

Получить URL-адрес по свойству, получить имя по тексту

url_list = []
name_list = []

for i in information_list:
    url_list.append(i['href'])  # 获取属性
    name_list.append(i.text)  # 获取文本

3. Создайте фрейм данных

gulong = pd.DataFrame({
    "name":name_list,
    "url":url_list}
)

gulong

Мы обнаружили, что конкретный адрес каждого романа на самом деле имеет общий префикс:www.kanunu8.com/book, теперь добавьте:

gulong['url'] = 'https://www.kanunu8.com/book' + gulong['url']   # 加上公共前缀
gulong.head()

Также мы хотим поставить название книги《》Чтобы удалить, используйте вместо этого функцию замены:

gulong["name"] = gulong["name"].apply(lambda x:x.replace("《",""))  # 左边
gulong["name"] = gulong["name"].apply(lambda x:x.replace("》","")) # 右边

# 保存
gulong.to_csv("gulong.csv",index=False)  # 保存到本地的csv文件

Последние отображаемые первые 5 строк данных:

Суммировать

В этой статье рассказывается об использовании библиотеки анализа данных из установки, принципах и анализе случая библиотеки BeautifulSoup4 и, наконец, рассказывается об использовании библиотеки анализа данных в сочетании с фактической реализацией сканера.Содержимое, представленное в этой статье, является лишь частью библиотека, которая удобна для пользователей, чтобы быстро начать работу.