Автор оригинала: Kayode Adechinan T. Salami.
Тематическое исследование
В этом руководстве вы узнаете, как очистить сайт электронной коммерции с помощью библиотеки BeautifulSoup python.
Что вам понадобится
Для этого урока вам понадобится полный образец веб-сайта электронной коммерции. Я связал образец веб-сайта электронной коммерции с полным исходным кодом учебника. Клонируйте репозиторий , откройте папку shop-cart и внутри нее выполните следующую команду. Он будет обслуживать содержимое папки.
python -m http.server 8000
Откройте свой веб-браузер по следующему адресу: http://localhost:8000/products.html
Как завершить этот учебник
1. Установите запросы и библиотеку beautifulsoup:
pip install requests pip install beautifulsoup4
2. Ваш первый парсинг с BeautifulSoup
from bs4 import BeautifulSoup import requests page = requests.get("http://localhost:8000/products.html") soup = BeautifulSoup(page.content, 'html.parser') print(soup.prettify())
Здесь мы делаем http-запрос для получения URL-адреса, на котором размещена наша веб-страница электронной коммерции. Затем мы анализируем содержимое полученной страницы с помощью ‘html.parser’ , который входит в стандартную библиотеку Python. И, наконец, мы показываем html-код!.
3. Извлеките все продукты
Если вы посмотрите на html-код за веб-страницей списка продуктов, вы можете заметить, что все продукты завернуты в тег div с классом well well-small вот так:
Our Products
И каждый продукт построен так:
Итак, ключ здесь в том, что вы не можете очистить сайт, если не знаете, как он построен. Вы должны выяснить, как идут дела. Совет здесь заключается в том, чтобы щелкнуть правой кнопкой мыши на любой странице и выбрать опцию view page source . Вот и ты.
Теперь мы можем использовать метод find_all для поиска элементов по классу или идентификатору. В нашем случае мы ищем все элементы li с классом span4 .
from bs4 import BeautifulSoup import requests page = requests.get("http://localhost:8000/products.html") soup = BeautifulSoup(page.content, 'html.parser') def retrieve_all_products(): print(soup.find_all('li', class_='span4')) if __name__ == '__main__': retrieve_all_products()
Если вы запустите его, он должен вернуть список в качестве ответа.
4. Получите цену продукта
Теперь давайте получим цену одного продукта
from bs4 import BeautifulSoup import requests page = requests.get("http://localhost:8000/products.html") soup = BeautifulSoup(page.content, 'html.parser') def retrive_first_product_price(): all_products = soup.find_all('li', class_='span4') product_one = all_products[0] product_one_price = product_one.find("strong") print(product_one_price.get_text()) print(product_one_price.get_text().strip().strip('$')) if __name__ == '__main__': retrive_first_product_price()
Во-первых, мы получаем все продукты. Затем мы берем результат и, исходя из этого, ищем цену. Этот находится внутри тега strong . Найдя цену, мы ее показываем. Мы также можем удалить символ$. Как видите, вы можете искать элемент на основе предыдущего результата поиска. В отличие от метода find_all , который возвращает list элементов или пустой список, метод find возвращает single элемент или None.
5. Создайте поддельный компаратор цен
Предположим, мы хотим сравнить наши продукты с их ценой в качестве критерия. Вот очень простой способ сделать это.
from bs4 import BeautifulSoup import requests page = requests.get("http://localhost:8000/products.html") soup = BeautifulSoup(page.content, 'html.parser') def lazy_comparator(): all_products = soup.find_all('li', class_='span4') products = {} for product in all_products: products[product.find("p").get_text().strip()] = product.find("strong").get_text().strip().strip('$') print (sorted([(v, k) for k, v in products.items()])) if __name__ == '__main__': lazy_comparator()
Вот несколько заметок. Получив весь продукт, мы помещаем каждый из них в словарь, а затем делаем фильтрацию.
Вот и все
Получите полный исходный код на github . Взгляните также на официальную документацию BeautifulSoup .