(一)BeautifulSoup
从本心来说,我更喜欢用BeautifulSoup。因为它更符合直观语义特性,find()和find_all()函数已经基本上足够提取出任何的信息,对于身份证号、QQ号等特征特别明显的数据,顶多再加上一个正则表达式就完全OK了。
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
pip install beautifulsoup4 #pip方式安装bs4
pip install lxml #pip方式安装 lxml 解析工具
具体介绍参见:
BeautifulSoup 的结构和用法简介
静下心来看完这篇博文才了解到原来BeautifulSoup有这么多的用法,特别是find_all()和find(),下面是一些实例:
#实例
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': "
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:61.0) Gecko/20100101 Firefox/61.0
"}
html = requests.get(url, headers=headers)
soup = BeautifulSoup(html.text, 'lxml') #以上是网络获取html
soup=BeautifulSoup(open('index.html')) # 读取本地的html,加个open函数即可
print(soup.prettify()) # 用标准html 显示方法打印html
#soup.find_all()方法介绍 ,soup.find()与之基本类似,只是返回的是第一个值
find_all( name , attrs , recursive , text , **kwargs )
soup.find_all('b') #查找所有的b标签,返回列表
soup.find_all(re.compile("^b")) # 正则表达式
soup.find_all(["a", "b"]) #传入列表参数,找到所有的a标签和b标签
soup.find_all(id='link2') #传入id是link2的参数,Beautiful Soup会搜索每个tag的”id”属性
soup.find_all(href=re.compile("elsie")) #传入正则表达式,查找所有的href标签内容中含有 elsie 的内容
soup.find_all(href=re.compile("elsie"), id='link1') # 多层过滤,除了href进行限定之外,对id标签的内容也做了限定
soup.find_all("div", class_="sister") #最常用的查找技巧,这里之所以加‘_=’是因为‘class’不仅是html中的tag,也是python语法的关键词,其他的不用加下划线
data_soup.find_all(attrs={"data-foo": "value"}) # 针对html5里面的data- 进行的专项查找
soup.find_all(text="Elsie") # 对text内容进行查找
soup.find_all(text=["Tillie", "Elsie", "Lacie"]) # 列表形式进行查找,与上面name类似
soup.find_all(text=re.compile("Dormouse")) # 正则表达式形式,与上面类似
soup.find_all("a", limit=2) # 找到前两个a标签, limit用来限定次数(
还有一个select()函数比较有用,基本用法如下:
# 我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是soup.select(),返回类型是list
(1)通过标签名查找
soup.select('title')