Python 之 Beautiful Soup 4文档
(ps:其实入门什么的看官方文档是最好的了,这里只是记录一下简单的用法。)
首先先介绍实际工作中最常用的几个方法:
举例的html代码(就用官方例子好了):
1 <html>
2 <head>
3 <title>Page title</title>
4 </head>
5 <body>
6 <p id="firstpara" align="center">
7 This is paragraph<b>one</b>.
8 </p>
9 <p id="secondpara" align="blah">
10 This is paragraph<b>two</b>.ubuntu怎么安装python
11 </p>
12 </body>
13 </html>
0、初始化:
1 soup = BeautifulSoup(html) # html为html源代码字符串,type(html) == str
1、用tag获取相应代码块的剖析树:
既然要分析html,首先要到对我们有用的tag块,beautiful提供了非常便利的方式。
#当用tag作为搜索条件时,我们获取的包含这个tag块的剖析树:
#<tag><xxx>ooo</xxx></tag>
#这里获取head这个块
head = soup.find('head')
# or
# head = soup.head
# or
# head = ts[0].contents[0]
运行后,我们会得到:
1 <head>
2 <title>Page title</title>
3 </head>
find方法在当前tag剖析树(当前这个html代码块中)寻符合条件的子树并返回。find方法提供多种查询方式,包括用喜闻乐见的regex哦~之后会详细介绍。
contents属性是一个列表,里面保存了该剖析树的直接儿子。
如:
1 html = ts[0] # <html> ... </html>
2 head = ts[0] # <head> ... </head>
3 body = ts[1] # <body> ... </body>
2、用contents[], parent, nextSibling, previousSibling寻父子兄弟tag
为了更加方便灵活的分析html代码块,beautifulSoup提供了几个简单的方法直接获取当前tag块的父子兄弟。
假设我们已经获得了body这个tag块,我们想要寻<html>, <head>, 第一个<p>, 第二个<p>这四个tag块:
# body = soup.bodyhtml = body.parent # html是body的父亲
head = body.previousSibling # head和body在同一层,是body的前一个兄弟
p1 = ts[0] # p1, p2都是body的儿子,我们用contents[0]取得p1
head = body.previousSibling # head和body在同一层,是body的前一个兄弟
p1 = ts[0] # p1, p2都是body的儿子,我们用contents[0]取得p1
p2 = p1.nextSibling # p2与p1在同一层,是p1的后一个兄弟, 当然t[1]也可得到
print p1.text
# u'This is paragraphone.'
print p2.text
# u'This is paragraphtwo.'
# 注意:1,每个tag的text包括了它以及它子孙的text。2,所有text已经被自动转
#为unicode,如果需要,可以自行转码encode(xxx)
然而,如果我们要寻祖先或者孙子tag怎么办呢?? 用while循环吗? 不, beautifulsoup已经提供了方法。
3、用find, findParent, findNextSibling, findPreviousSibling寻祖先或者子孙 tag:
有了上面的基础,这里应该很好理解了,例如find方法(我理解和findChild是一样的),就是以当前节点为起始,遍历整个子树,到后返回。
而这些方法的复数形式,会到所有符合要求的tag,以list的方式放回。他们的对应关系是:find->findall, findParent->findParents, findNextSibling-&
如:
1 print soup.findAll('p')
2 # [<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>, <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>]
这里我们重点讲一下find的几种用法,其他的类比:
find(name=None, attrs={}, recursive=True, text=None, **kwargs)
(ps:只讲几种用法,完整请看官方link :ummy/software/BeautifulSoup/bs3/documentation.zh.html#The%20basic%20find%20method:%20findAll%28name,%20attrs,%20recursive,%20text,%20limit,%20**kwargs%29)
1) 搜索tag:
1 find(tagname) # 直接搜索名为tagname的tag 如:find('head')
2 find(list) # 搜索在list中的tag,如: find(['head', 'body'])
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论