Работа с BeautifulSoup4
Установка
| |
Сравнение парсеров
Beautiful Soup поддерживает HTML-парсер, включенный в стандартную библиотеку Python, но также поддерживает ряд сторонних парсеров:
html.parser- стандартный питоновский парсер. Нестрогий, имеет приемлемую скорость, но не такой быстрый, какlxmlи более строгий, чемhtml5lib.- HTML-парсер в
lxml- очень быстрый, нестрогий, но имеющий внешнюю зависимость отC - XML-парсер в
lxml- eдинственный поддерживаемый XML-парсер. Очень быстрый, но имеет внешнюю зависимость отC html5lib- разбирает страницы так же, как это делает браузер. Создает валидный HTML5. Очень нестрогий, очень медленный и имеет внешнюю зависимость от Python
| |
Making the soup
Чтобы распарсить документ, нужно передать в конструктор BeautifulSoup строку. Этой строкой и будет полученный html.
| |
page.text - возвращает HTML-содержимое объекта ответа в Unicode.
page.content - возвращает содержимое ответа в байтах.
page.headers.get("content-type", "unknown") - можно проверить какой тип контента вернулся.
Виды объектов
Beautiful Soup превращает сложный HTML-документ в сложное дерево объектов Python. Однако нам придется иметь дело только с четырьмя видами объектов: Tag, NavigableString, BeautifulSoup и Comment.
Errors
- InsecureRequestWarning: Unverified HTTPS request is being made to host xxx Подробное решение тут
| |
- TypeError: object of type ‘Response’ has no len()
Скорее всего в качестве первого параметра в BS4 передана не строка, а что-то другое. Убедитесь, что передаете не response, а response.text.
- Error: HTTPSConnectionPool(host=‘some_host’, port=443): Max retries exceeded with url: /some/path/ (Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)’)))
В этом случае нужно либо отключить проверку SSL-сертификата (плохое решение)
| |
Либо (что гораздо лучше) создать сессиию и примонтировать адаптер:
| |
Если у вас Mac и python установлен через brew, то ошибка может возникать из-за того, что по какой-то причине brew не запустил команду Install_Certificates.command, которая поставляется в пакете Python3 для Mac. Решение тут
Последний вариант: чтобы использовать непроверенный ssl, вы можете добавить это в свой код:
| |