提取网络有用信息的工具的常用工具有三种,之前先后学习了正则匹配和Xpath,今天学习另一个工具BeautifulSoup。和lxml一样,bs4也是html/xml的解析器,主要功能就是解析和提取。
使用BeautifulSoup前需要导入bs4。方法为在命令行输入from bs4 import BeautifulSoup。首先要创建BeautifulSoup对象:soup=BeautifulSoup(html,'lxml'),然后格式化soup对象的内容:print(soup.prettify())。BeautifulSoup可将复杂的HTML转换为复杂的树形结构。每个节点都是一个python对象。Tag就是HTML中的一个个标签。利用soup加标签名获得标签的内容,这些对象的类型是bs4.element.Tag,但是注意,它查找的是在所有内容中的第一个符合要求的标签。对于Tag,它有两个重要的属性,是name和attrs,用.sting可获得标签里的内容。
对于生成的树,我们要进行相关的操作。历文档数:1.直接子节点:contents,children,tag的.contents属性可以将tag的子节点以列表的方式输出:print(soup.head.contents),输出方式为列表,我们可以用列表列表索引来获取某一个元素。children它返回的不是一个list,不过我们可以通过遍历获取所有子节点。返回的是生成器对象:for child in soup.body.children;print(child)。2.所有的子孙节点:.descendants属性,.contents和.children属性包含tag的直接子节点,.descendants属性可以对所有Tag的子孙节点进行递归循环,和.children类似,我们也需要遍历获取其中的内容。
搜索文档树方法:1.find_all(name,atters,recursive,text,**kwargs),1)name参数:可以查找所有名字为name的Tag,字符串对象会被自动忽略。A.传字符串,最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,Beautiful Soup会查找完全匹配的内容,print(soup.find_all('b')。B.传正则表达式如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的match()来匹配内容。C.传列表如果传入列表参数,Beatiful Soup会将与列表中任一匹配的内容返回。2)keyword参数soup.find_all(id='link2')或其他属性。
学习了三种爬虫的方法,我将各种爬取方式进行了比较:1、正则:速度:最快,难度:最难,无需安装,2、xpath(lxml):速度:中等,难度:中等,需要安装lxml,3、bs4:速度:慢,难度:低,需要安装。
最后一次练习为爬取古诗词指定页数的古诗词,包括注释。