Py之解析库BeautifulSoup学习

1.基本用法

>>> from bs4 import BeautifulSoup
>>> soup=BeautifulSoup('<p>Hello</p>','lxml')
>>> soup.p.string
'Hello'

2. 节点选择

选择元素

>>> html="""
<ul class="topnav-noauth clearfix">
<li>
<a href="javascript:;" class="js-signup-noauth"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>
<li>
<a href="javascript:;" class="js-signin-noauth">登录</a>
</li>
</ul>
>>> h=BeautifulSoup(html,'lxml')
>>> h
<html><body><ul class="topnav-noauth clearfix">
<li>
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>
<li>
<a class="js-signin-noauth" href="javascript:;">登录</a>
</li>
</ul>
</body></html>
>>> h.ul
<ul class="topnav-noauth clearfix">
<li>
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>
<li>
<a class="js-signin-noauth" href="javascript:;">登录</a>
</li>
</ul>
>>> h.a.string
>>> 

//在赋值html时,需要使用三个“”“ ,并且换行后粘贴内容。

获取属性

>>> h.a['href']
'javascript:;'
>>> h.i['class']
['zg-icon', 'zg-icon-dd-home']
>>> h.a['class']
['js-signup-noauth']

直接使用[]获取即可,但是只识别当前html中出现的第一个标签, 如果属性有多个则组成list。

获取内容

>>> h.li.string
>>> h.i.string
>>> h.a.string

//很奇怪这里的a为什么获取不到?理应出现:注册知乎。

嵌套选择

>>> h.ul.li
<li>
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>

3.关联选择

子节点和子孙节点

-获取直接子节点,使用contents,返回的是列表类型的。

>>> h.li.contents
['
', <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>, '
']

-和上面一样,但是返回的是生成器类型的,使用枚举遍历。

>>> ch=h.li.children
>>> for i,c in enumerate(ch)
SyntaxError: invalid syntax
>>> for i,c in enumerate(ch):
    print(i,c)

0 

1 <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
2 

要想层次地遍历以获取内部全部标签:

>>> de=h.li.descendants
>>> for i,d in enumerate(de):
    print(i,d)

0 

1 <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
2 <i class="zg-icon zg-icon-dd-home"></i>
3 注册知乎
4 

>>> 

 父节点和祖先节点

>>> h.i.parent #父亲节点
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
>>> h.li.next_sibling #兄弟节点
'
'
>>> list(enumerate(h.li.next_sibling))
[(0, '
')]
>>> list(enumerate(h.ul.next_sibling))
[(0, '
')]
>>> list(enumerate(h.a.next_sibling))
[(0, '
')]
>>> list(enumerate(h.i.next_sibling))
[(0, ''), (1, ''), (2, ''), (3, '')]
>>> 

 4.提取信息

>>> list(h.a.parents)[0]
<li>
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>
>>> list(h.a.parents)[1].attrs['class']
['topnav-noauth', 'clearfix']

 这里使用parents,是generator类型,先将其转换为list类型。

5.方法选择器

find_all()

根据标签名查找

>>> h.find_all(name='li')
[<li>
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>, <li>
<a class="js-signin-noauth" href="javascript:;">登录</a>
</li>]
>>> h.find_all(name='a')
[<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>, 
<a class="js-signin-noauth" href="javascript:;">登录</a>]

>>> h.find_all(name='a')[0]
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>

根据属性名查找

>>> h.find_all(attrs={'href':'javascript:;'})
[<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>, 
<a class="js-signin-noauth" href="javascript:;">登录</a>]

属性是字典。

text匹配节点文本

>>> h.find_all(text=re.compile(''))
['登录']

find() //只返回第一个匹配的

>>> h.find(name='li')
<li>
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>
>>> h.find_all(name='li')
[<li>
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>, <li>
<a class="js-signin-noauth" href="javascript:;">登录</a>
</li>]

6.CSS选择器

>>> html="""
<ul class="topnav-noauth clearfix">
<li>
<a href="javascript:;" class="js-signup-noauth"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>
<li>
<a href="javascript:;" class="js-signin-noauth">登录</a>
</li>
</ul>
"""
>>> h=BeautifulSoup(html,'lxml')
>>> h.select('.clearfix')
[<ul class="topnav-noauth clearfix">
<li>
<a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>
</li>
<li>
<a class="js-signin-noauth" href="javascript:;">登录</a>
</li>
</ul>]
>>> h.select('.zg-ico')
[]
原文地址:https://www.cnblogs.com/BlueBlueSea/p/11037207.html