今天有朋友问到了BeautifulSoup的一个用法,于是我心血来潮,准备将BeautifulSoup的基本用法在这写写。
安装不多说,windows下打开cmd直接:
pip install BeautifulSoup4
测试是否成功安装,在IDE下:
from bs4 import BeautifulSoup
导入就是成功安装了。
这里我们用的解析器是lxml,没有lxml的话要先安装lxml:pip install lxml
首先实例化一个解析对象。我这里是用requests库请求https://www.taobao.com,来做测试的。
到这里我先说下我最终的需求:

提取淘宝首页导航条的各个条目及其连接。
#请求淘宝首页
import requests
html = requests.get('https://www.taobao.com').text
#实例化解析对象
soup = BeautifulSoup(html,'lxml') #后面的那个参数是指定解析库
获取节点
>>soup.ul
#即可匹配到第一个ul节点的内容
<ul class="site-nav-bd-l" data-spm-ab="1" id="J_SiteNavBdL">
<li class="site-nav-menu site-nav-login" data-name="login" data-spm="754894437" id="J_SiteNavLogin">
<div class="site-nav-menu-hd">
<a href="//login.taobao.com/member/login.jhtml?f=top&redirectURL=https%3A%2F%2Fwww.taobao.com%2F" target="_top">
<span>亲,请登录</span>
</a>
</div>
</li>
<li class="site-nav-tmsg tmsg site-nav-multi-menu J_MultiMenu" data-name="tmsg" data-spm="1997563201" id="J_Tmsg">
省略部分内容
</li>
</ul>
#因为soup.ul的结果还是tag类型,所以我们可以链式的查找下级节点。
>>type(soup.ul)
#<class 'bs4.element.Tag'>
>>soup.ul.li
<li class="site-nav-menu site-nav-login" data-name="login" data-spm="754894437" id="J_SiteNavLogin">
<div class="site-nav-menu-hd">
<a href="//login.taobao.com/member/login.jhtml?f=top&redirectURL=https%3A%2F%2Fwww.taobao.com%2F" target="_top">
<span>亲,请登录</span>
</a>
</div>
</li>
#以上是获取单个节点的方法
获取属性和文本 - 承上
获取属性有两种方式。
>>soup.ul.li.a['href'] #获取a节点的href属性
'//login.taobao.com/member/login.jhtml?f=top&redirectURL=https%3A%2F%2Fwww.taobao.com%2F'
也可以这样写...
>>soup.ul.li.a.attrs['href']
'//login.taobao.com/member/login.jhtml?f=top&redirectURL=https%3A%2F%2Fwww.taobao.com%2F'
>>soup.span.string #这里就将span节点内的文本内容提取出来了。
'亲,请登录'
子节点,子孙节点,兄弟节点,父节点,祖辈节点
contents
children
descendents
parent
parents
next_sibling
previous_sibling
next_siblings
previous_siblings
find_all(),find()
bs4还给我们提供了方法选择器:
API : find_all(name,attrs,recursive,text,**kwargs)
CSS选择器:这个很强大
soup.select()
今天先把框架写好吧,有点晚了,改天有时间再补全
网友评论