Beautifulsoup4库的使用
??要点:beautifulsoup4库是一个解析和处理HTML和XML的第三方库。
1.beautifulsoup4库概述
??使用requests库获取HTML页面并将其转换成字符串后,需要进一步解析HTML页面格式,提取有用信息,这需要处理HTML和XML的函数库。
??beautifulsoup4库,也称为Beautiful Soup库或bs4库,用于解析和处理HTML和XML。需要注意的是,它不是BeautifulSoup库。它的最大优点是能根据HTML和XML语法建立解析树,进而高效解析其中的内容。
??HTML建立的Web页面一般非常复杂,除了有用的内容信息外,还包括大量用于页面格式的元素,直接解析一个Web网页需要深入了解HTML语法,而且比较复杂。beautifulsoup4库将专业的Web页面格式解析部分封装成函数,提供了若干有用且便捷的处理函数。
??在使用beautifulsoup4库之前,需要进行引用,由于这个库的名字非常特殊且采用面向对象方式组织,可以用from-import方式从库中直接引用BeautifulSoup类,方法如下:
>>>from bs4 import BeautifulSoup
2.beautifulsoup4库解析
??beautifulsoup4库中最主要的是BeautifulSoup类,每个实例化的对象相当于一个页面。采用from-import导入库中的Beautifulsoup类后,使用BeautifulSoup()创建一个BeautifulSoup对象。
>>>import requests
>>>from bs4 import BeautifulSoup
>>>r = requests.get("http://www.baidu.com")
>>>r.encoding = "utf-8"
#为了简化代码,没有考虑异常情况
>>>soup = BeautifulSoup (r.text)
#soup就是一个BeautifulSoup对象
>>>type(soup)
<class 'bs4.BeautifulSoup'>
??创建的BeautifulSoup对象是一个树形结构,它包含HTML页面中的每一个Tag(标签)元素,如head、body等。
??BeautifulSoup对象的常用属性(共6个)
属性 | 描述 |
---|
head | HTML页面的head内容 | title | HTML页面标题,在head之中,由title标记 | body | HTML页面的body内容 | P | HTML页面中第一个p内容 | strings | HTML页面所有呈现在Web上的字符串,即标签的内容 | stripped_strings | HTML页面所有呈现在Web上的非空格字符串 |
>>>soup.head
>>>title=soup.title
<title>百度一下,你就知道</title>
>>>type(title) #每个对应HTMLTag的属性是一个Tag类型
<class 'bs4.element.Tag'>
>>>soup.p
??BeautifulSoup属性与HTML的标签名称相同,每一个Tag标签beautifulsoup4库中也是一个对象,称为Tag对象。其中,尖括号(<>)中标签的名字是name,尖括号内其他项是attrs,尖括号之间的内容是string。因此,可以通过 Tag对象的name、attrs和string属性获得相应内容。 ??标签对象的常用属性(共4个)
属性 | 描述 |
---|
name | 字符串,标签的名字,比如div | attrs | 字典,包含了原来页面Tag所有的属性,比如href | contents | 列表,这个Tag下所有子Tag的内容 | string | 字符串,Tag所包围的文本,网页中真实的文字 |
>>>soup.a # 只返回第一个
<a class="mnav"href="http://www.nuomi.com">糯米</a>
>>>soup.a.name
'a'
>>>soup.a.attrs
{'href':'http://www.nuomi.com','class':['mnav']}
>>>soup.a.string
,糯米’
>>>title.name #title变量在上段例子中已经定义
'title'
>>>title.string
,百度一下,你就知道
>>>soup.p.contents 这个Tag下所有子Tag的内容
??由于HTML语法可以在标签中嵌套其他标签,所以,string属性的返回值遵循如下原则。
??(1)如果标签内部没有其他标签,string属性返回其中的内容。
??(2)如果标签内部还有其他标签,但只有一个标签,string属性返回最里面标签的内容。
??(3)如果标签内部有超过1层嵌套的标签,string属性返回None(空字符串)。
??HTML语法中同一个标签会有很多内容。
??当需要列出标签对应的所有内容或者需要找到非第一个标签时,需要用到BeautifulSoup的find()和find_all()方法。这两个方法会遍历整个HTML文档,按照条件返回标签内容。
BeautifulSoup.find_all(name, attrs, recursive, string, limit)
??作用:根据参数找到对应标签,返回列表类型。
??参数如下:
????name:按照Tag标签名字检索,名字用字符串形式表示,例如div、li。
????attrs:按照Tag标签属性值检索,需要列出属性名称和值,采用JSON表示。
????recursive:设置查找层次,只查找当前标签下一层时使用recursive=False。
????string:按照关键字检索string属性内容,采用string=开始。
????limit:返回结果的个数,默认返回全部结果。
>>>a = soup.find all('a') #查找所有的<a>
>>> len (a)
13
>>>soup.find_all('script')
>
>>>soup.find_all('script'{'src':'http://www.zgxiangxin.com/\jquery/jquery-1.9.4.min.js'})#筛选,只查找src=字符和串的标签
>>>import re #使用正则表达式库,可以用这个库实现字符串片段匹配
>
>>>soup.find_all('script',{'src':re.compile('jquery')})
>
>>>soup.find_all(string=re.compile('百度'))
??BeautifulSoup的find_all()方法可以根据标签名字、标签属性和内容检索并返回标签列表,通过片段字符串检索时需要使用正则表达式re函数库,re是Python 标准库,直接通过 import re 即可使用。采用 re.compile(‘jquery’)实现对片段字符串(如’jquery’)的检索。当对标签属性检索时,属性和对应的值采用JSON格式,例如:
'src':re.compile('jquery')
??其中,键值对中值的部分可以是字符串或者正则表达式。
拓展:正则表达式
??正则表达式是字符串的一种逻辑表达,一般在计算机编译器中使用。Python语言采用正则表达式辅助字符串查找。正则表达式是一种规则,只要字符串符合这个规则,就算作匹配。例如,通过re.compile()函数注册一个正则表达式jquery’,则所有包含该表达式的字符串都与它匹配,除了字符串,正则表达式还可以通过*+{}目等符号扩展功能。
??除了find_all()方法,BeautifulSoup类还提供一个find()方法,官们的区别只是前者返回全部结果而后者返回找到的第一个结果,find_all())函数由于可能返回更多结果,所以采用列表形式;find()函数返回字符串形式。
BeautifulSoup.find(name,attrs,recursive,string)
??作用:根据参数找到对应标签,K用字符串返回找到的第一个值。
??参数:与find_all()方法一样。
??处理网页需要对HTML有一定的理解,而实现爬虫并不算复杂,BeautifulSoup4 库是一个非常完备且活跃的HTML解析函数库,它还可以完成更多复杂操作。
|