Requests库的用法大家肯定已经熟练掌握了,但是当我们使用Requests获取到网页的 HTML 代码信息后,我们要怎样才能抓取到我们想要的信息呢?我相信大家肯定尝试过很多办法,比如字符串的 find 方法,还有高级点的正则表达式。虽然正则可以匹配到我们需要的信息,但是我相信大家在匹配某个字符串一次一次尝试着正则匹配的规则时,一定很郁闷。
那么,我们就会想有没有方便点的工具呢。答案是肯定的,我们还有一个强大的工具,叫BeautifulSoup。有了它我们可以很方便地提取出HTML或XML标签中的内容,这篇文章就让我们了解下BeautifulSoup的常用方法吧。
什么是BeautifulSoup?
Python的网页解析可以用正则表达式去完成,那么我们在写的时候,要挨个的去把代码拿出来匹配,而且还要写匹配的规则,整体实现起来就很复杂。BeautifulSoup呢,它是一个方便的网页解析库,处理高效,支持多种解析器。大部分情况下,利用它我们不在需要编写正则表达式就可以方便的实现网页信息的提取。
1.安装beautifulsoup4库:
pip install beautifulsoup4
2.BeautifulSoup是一个网页解析库,它支持很多解析器,不过最主流的有两个。一个是Python标准库,一个是lxml HTML 解析器。两者的使用方法相似:
# Python的标准库
BeautifulSoup(html, 'html.parser')
# lxml
BeautifulSoup(html, 'lxml')
Python内置标准库的执行速度一般,但是低版本的Python中,中文的容错能力比较差。lxmlHTML 解析器的执行速度快,但是需要安装 C语言的依赖库。
pip install lxml
3.方法选择器 :find_all() /fin()
find_all(name , attrs , recursive , text , **kwargs)
可以根据标签名,属性,文本来定位我们的目标值。
1):标签名 获取:
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf8')
html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
'''
print (html)
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(name='ul'))
for ul in soup.find_all(name='ul'):
# 嵌套查询
print(ul.find_all(name='li'))
for li in ul.find_all(name='li'):
# 打印li标签的文本值
print(li.string)
2:属性获取:
# (2)attrs
# 除了根据节点名查询,我们也可以传入一些属性来查询,示例如下:
attrsList = soup.find_all(attrs={'id':'list-1'})
print (attrsList)
# 获取匹配attrs的值
for i in attrsList:
# 嵌套查询
for l in i.find_all('li'):
# 获取文本值
print (l.string)
3):文本获取:
# (3)text
# text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象,示例如下:
textList = soup.find_all(text='Foo')
print (textList)
4.CSS选择器 :
Beautiful Soup还提供了另外一种选择器,那就是CSS选择器。如果对Web开发熟悉的话,那么对CSS选择器肯定也不陌生。如果不熟悉的话,可以参考http://www.w3school.com.cn/cssref/css_selectors.asp了解。