首页 > 其他 > 详细

Py之解析库BeautifulSoup学习

时间:2019-06-16 23:33:25      阅读:151      评论:0      收藏:0      [点我收藏+]

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
[\n, <a class="js-signup-noauth" href="javascript:;"><i class="zg-icon zg-icon-dd-home"></i>注册知乎</a>, \n]

 

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

>>> 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 #兄弟节点
\n
>>> list(enumerate(h.li.next_sibling))
[(0, \n)]
>>> list(enumerate(h.ul.next_sibling))
[(0, \n)]
>>> list(enumerate(h.a.next_sibling))
[(0, \n)]
>>> 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>]

 

Py之解析库BeautifulSoup学习

原文:https://www.cnblogs.com/BlueBlueSea/p/11037207.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!