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>]
原文:https://www.cnblogs.com/BlueBlueSea/p/11037207.html