BeautifulSoup4 的使用
待测试的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| dot = """ <html><head><title>dotcpp</title></head> <body> <p><b>c语言网</b></p> <p>编程网站 <a href="https://www.dotcpp.com/" id="link1">home</a>, <a href="https://blog.dotcpp.com/" id="link2">blog</a> <a href="https://www.dotcpp.com/oj/problemset.html" id="link3">oj</a></p> """ from bs4 import BeautifulSoup soup = BeautifulSoup(dot,"html.parser") print(soup.prettify()) print(soup.title) print(soup.title.name) print(soup.title.string) print(soup.head) print(soup.div) print(soup.a) print(soup.find_all("a")) print(soup.find(id = "dot"))
|
输出结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <html> <head> <title> dotcpp </title> </head> <body> <p> <b> c语言网 </b> </p> <p> 编程网站 <a href="https://www.dotcpp.com/" id="link1"> home </a> , <a href="https://blog.dotcpp.com/" id="link2"> blog </a> <a href="https://www.dotcpp.com/oj/problemset.html" id="link3"> oj </a> </p> </body> </html> <title>dotcpp</title> title dotcpp <head><title>dotcpp</title></head> None <a href="https://www.dotcpp.com/" id="link1">home</a> [<a href="https://www.dotcpp.com/" id="link1">home</a>, <a href="https://blog.dotcpp.com/" id="link2">blog</a>, <a href="https://www.dotcpp.com/oj/problemset.html" id="link3">oj</a>] None
|
注意解析html网页的解析方式,我们采用了Python中自带的html.parser,其实还可以选择 lxml HTML、lxml XML 和 html5lib 等解析器,他们分别有着优劣点。我们在使用BeautifulSoup的时候一定要注意的就是网页解析,正确的解析方式十分重要。
BeautifulSoup4 的四个对象
- Tag
对应HTML中的标签。如上:
1 2
| print(soup.title) print(soup.a)
|
Tag 有两个属性,分别是 name 和 attrs,name 也就是标签的名字,attrs 对应 class、id 等信息。
NavigableSting
对应的是标签内部的文字
1
| print(suop.title.string)
|
BeautifulSoup
对应的是文档中的内容,它类似于一个特殊的标签,我们可以获取到它的类型、名称和属性。
1
| soup = BeautifulSoup(html,"html.parser")
|
是一个特殊的NavigableSting对象,它输出的内容没有注释符号,如果不加以处理会影响我们对文档的解析,因为这种方式会忽略掉文档的注释,
因此注释中的内容会以代码格式被解析出来,进而影响我们的后续操作,所有我们 一般会采用.string来输出内容。
遍历文档树
在解析文档文件的过程中,如果需要遍历文档,我们需要使用到一些特殊的方法。
.contents
获取Tag的所有子节点,以列表的形式返回。
1 2 3
| con = soup.head.contents for i in con: print(i)
|
.children
获取Tag的所有子节点,存储在一个生成器中,可以直接通过遍历的方式来访问,和上面例子一致。
.descendants
获取Tag的所有子孙节点。
.strings
获取子孙节点中的所有内容,可以通过遍历的方式来访问。
- .parent
获取到Tag标签的父节点。
- .parents
递归得到所有父辈节点,存放在一个生成器中,可以通过遍历的方式来访问。
- .previous_siblings
获取Tag上面的所有兄弟节点,返回生成器。
- .next_siblings
获取Tag下面的所有兄弟节点,返回生成器。
9. .has_attr
用于判断Tag是否包含属性。
搜索文档数
我们在使用的过程中如果要匹配到搜索内容的全部信息,这时候就需要搜索整个文档树,我们需要采用到find_all方法,这个过滤器能贯穿整个搜索的AIP,它可以使用在tag的name中。
语法格式:
1
| find_all( name , attrs , recursive , text , **kwargs )
|
name参数即tag的名字,attrs为类或id,recursive为递归性,text为文本参数。