【Python高级编程】基于BeautifulSoup的爬虫
一、BeautifulSoup简介
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。 Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
BS基于DOM结构进行页面内容解析,当开始解析时,会将整个页面的DOM树保存于内存中,进而实现查找。
解析器:
(1)Python标准库 BeautifulSoup(markup, “html.parser”) Python的内置标准库、执行速度适中 、文档容错能力强 (2)lxml HTML 解析器 BeautifulSoup(markup, “lxml”) 速度快、文档容错能力强 需要安装C语言库 (3)lxml XML 解析器 BeautifulSoup(markup, “xml”) 速度快、唯一支持XML的解析器 需要安装C语言库 (4)html5lib BeautifulSoup(markup, “html5lib”) 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 速度慢、不依赖外部扩展
二、具体代码使用
from bs4 import BeautifulSoup
import requests
resp = requests.get('http://www.woniunote.com/')
# 初始化解析器
html = BeautifulSoup(resp.text, 'lxml')
# 查找页面元素(根据标签层次进行查找)
# print(html.head.title) # 根据标签的层次找页面标题
# print(html.head.title.string) # 获取页面标题的文本内容
# print(html.div) # 查找页面中的第一个DIV元素
# print(html.div.div.div)
# 查找页面元素的通用方法:
# 1、find_all:根据标签,属性,XPath等进行查找
# 2、select:CSS选择器,div, #id, .class
# 查找页面所有超链接
links = html.find_all('a')
for link in links:
print(link['href'])
# 查找页面的图片
images = html.find_all('img')
for image in images:
print(image['src'])
# 根据id或class等属性查找
keyword = html.find(id='keyword')
print(keyword)
print(keyword['placeholder'])
#
titles = html.find_all(class_='title')
for title in titles:
# print(title)
print(title.string)
# print(title.find('a'))
# print(title.find('a').string
#
# print('=========================================')
title = html.find(text='揭秘:带你了解学员眼中真实的阿多比!')
print(title.parent)
print(title.parent.parent)
#
# print('=========================================')
# # 根据xpath的风格进行查找 //div[@class='title']
titles = html.find_all('div', {'class':'title'})
for title in titles:
print(title.string)
#
# print('=========================================')
# CSS选择器
# titles = html.select('div.title')
titles = html.select('.title')
for title in titles:
print(title.string)
keyword = html.select('#keyword')
print(keyword[0]['placeholder'])
lis = html.select('ul li')
print(lis)
三、参考资料:
https://blog.csdn.net/KOBEYU652453/article/details/113189859
https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
https://www.cnblogs.com/Yiutto/p/5387021.html