Python之BeautifulSoup常用详细使用
因工作需要,日常工作中有不少时间是用在了反复登陆内网。
故详细研究测试了BeautifulSoup的用法,总结下来备用爬网页之需。
首先是导入模块并初始化了:
from bs4 import BeautifulSoup soup=BeautifulSoup(opener)
#1、tag标签法
如果一层层的标签包下去,只取每层标签第一个,或只有唯一一个时,可以用
soup.head.title
但并行多个同名标签的则不能title[2]之类查找
#2、contents法
根据文档树进行搜索,返回标记对象(tag)的列表,注意,直接.contents,返回的是列表,不是单一元素
使用contents向后遍历树,使用parent向前遍历树
共两种用法:
soup.contents
soup.contents[x].contents
返回值是包含html标签全部内容的列表。比如可能是三元素:[u\’\n\’,\'<html>xxxx</html>\’,u\’\n\’]
soup.contents[x]则是对列表各元素值的获取了
soup.contents[x].contents
返回值是目标标签的下一层(即为该标签为父,则抓取到的都是子的列表)全部标签的列表。这里如果x取错,可能会导致
错误,因为取错则生不成列表,后面contents会弹错。
如
1 soup.contents[1]=u\’HTML\’
2 soup.contents[2]=u\’\n\’
3 soup.contents[3]=<html>…</html>
而
soup.contents[3].contents=[u\'\n\',<head>...</head>,u\'\n\',<body>...</body>,u\'\n\']
以此类推,soup.contents[3].contents[3]=肯定是上述列表中的第四个元素body。
#3、.next法
只能针对单一元素进行.next,或者说是对contents列表元素的挨个清点。
比如
soup.contents[1]=u\'HTML\' soup.contents[2]=u\'\n\'
则soup.contents[1].next等价于soup.contents[2]
#搜索法
find(name=None, attrs={}, recursive=True, text=None, **kwargs)
主要2个:.find(\’p\’),.findAll(\’p\’)
find返回的是字符串值,而且是返回从头查找到的第一个tag对。但是如果这第一个tag对包括大量的内容,父等级很高,则同时其内部所包含的
此级标签也全部都find
findAll返回值是个列表,如果发现了一个同名标签内含多个同名标签,则内部的标签一并归于该父标签显示,列表其他元素也不再体现那些内含
的同名子标签。
比如:
soup.findAll(onclick=\'document.location...\') soup.findAll(attrs={\'style\':r\'outline:none;\'}) #用来查找属性中有style=\'outline:none;的标签体。
#4、.attrs[x]获取属性值法
在上述各种方法找到唯一的标签体之后,可以通过对标签实施attrs,得到一个内部属性的列表。
在标签后面新增.attrs[\’id\’]等等即可取得该标签内部id的属性值
比如:
soup.contents[3]==<meta abc=\'god\' href=\'/\'> soup.contents[3].attrs=={\'abc\':\'god\',\'href\':\'/\'} soup.contents[3].attrs[1]=\'/\'