因工作需要,日常工作中有不少时间是用在了反复登陆内网。
故详细研究测试了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]=‘/‘
Python之BeautifulSoup常用详细使用