beautifulsoup(简称bs) 是解析、遍历、维护“标签树”的功能库。
标签概要
![](https://img.haomeiwen.com/i19725743/6ddf9b2951b9cfb2.png)
只要提供的是标签类型,bs 对它都可以做很好的解析。
bs 的引用
from bs4 import BeautifulSoup # 从bs4 库中引用BeautifulSoup 类
# 也可以直接引用bs4
import bs4
BeautifulSoup 类
bs 类就是一个可以代表标签树的类型。
甚至可以认为html 文档,标签树,bs类,这三者是等价的。
![](https://img.haomeiwen.com/i19725743/f698e1c560dc78b0.png)
在这个基础上,我们就可以通过bs类,使得标签树形成了一个变量,通过对变量的处理。
简单来说,我们可以把beautiful soup 类当作一个HTML/XML 文档的全部内容。
bs的解析器
from bs4 import BeautifulSoup
mk = '<html>data</html>'
BeautifulSoup(mk, 'html.parser') # bs4的HTML解析器
BeautifulSoup(mk, 'lxml') # lxml的HTML解析器
BeautifulSoup(mk, 'xml') # lxml的XML解析器
BeautifulSoup(mk, 'html5lib') # html5lib的解析器
bs的基本元素
<p class = ' '>...</p>
其中<></>
标注开头结尾,为tag。
p
为name。
class 为attributes信息,且为字典格式。
...
为NavigableString,是标签内的非属性字符串。
标签内的注释部分为一种特殊的Comment类型。
我们可以通过requests获得页面内容,接着将页面文本内容通过bs 解析。
from bs4 import BeautifulSoup
import requests
r = requests.get('https://python123.io/ws/demo.html')
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
可以直接查看soup信息
>>> soup
<html><head><title>This is a python demo page</title></head>
<body>
<p class="title"><b>The demo python introduces several python courses.</b></p>
<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>
</body></html>
Tag
通过上述soup 的解析内容,我们可以获得各种类型的标签。
1)title: soup.title
标题标签
>>> soup.title
<title>This is a python demo page</title>
2)a:soup.a
链接标签
>>> soup.a
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
任何存在于html 语法的标签,都可以使用soup.tag
方式访问获得。
当html 存在多个相同的tag 标签时,soup.tag
可以返回其中的第一个。
Name
获得某个标签的名字。返回值为字符串形式。
soup.title.name
'title'
其实按照之前的html 标签概要也不难发现,html 是存在一定的结构关系的。因此我们可以尝试获取某个标签的父标签。
可以得知a的父标签为p标签。
>>> soup.a.parent.name
'p'
Attributes
属性为字典形式的内容。
我们可以查看a标签的属性。
soup.a.attrs
{'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
我们还可以对每个属性进行提取。利用字典的提取方法。
soup.a.attrs['class']
无论有没有属性,我们都可以获得字典(没有就是空字典)。
NavigableString
获得尖扩号中的内容。
>>> soup.p.string
'The demo python introduces several python courses.'
可以发现,我们打印出的string,并不包含b 标签。(b 为p的子标签)这说明NavigableString 可以跨越多个标签层次。
Comment
表示注释部分。
在html 表达中用下面方式来包含注释信息,并与NavigableString在相同的位置,即两个<>
之间。
<!--...-->
但当我们调用标签中的注释信息时,它也没有什么不同。因此有些时候需要根据类型来对标签中的string 进行区分。
小结
可以将name, attributes, navigablestring, comment都看作是tag 下的详细组成结构。
![](https://img.haomeiwen.com/i19725743/8e4e2404aa114734.png)
网友评论