Beautiful Soup库的理解:
Beautiful Soup库是解析、遍历、维护“标签树”的功能库。
属性用来定义标签的特点,由键值对构成.
Beautiful Soup库的引用:
Beautiful Soup库,也叫 beautifulsoup4 或 bs4。
from bs4 import BeautifulSoup
import bs4
如何理解BeautifulSoup这个类呢?
BeautifulSoup 本身解析的是 HTML 和 XML 的文档,这个文档和标签树是一一对应的,经过了 BeautifulSoup类的处理,将标签树转换为 BeautifulSoup类,BeautifulSoup类就是能够代表标签树的一个类型。
可以理解为标签树就是一个字符串。
事实上,我们认为 HTML文档、标签树、BeautifulSoup类三者等价。
from bs4 import BeautifulSoup
soup1 = BeautifulSoup("<html>data</html>", "html.parser")
soup2 = BeautifulSoup(open("S:\Pycharm\Project\demo\python123demo\demo.html"), "html.parser")
BeautifulSoup 对应一个 HTML/XML 文档的全部内容。
Beautiful Soup库解析器:
解析器 | 使用方法 | 条件 |
---|---|---|
bs4的HTML解析器 | BeautifulSoup(mk, ‘html.parser’) | 安装bs4库 |
lxmI的HTML解析器 | BeautifulSoup(mk, ‘Ixml’) | pip install lxml |
lxml的XML解析器 | BeautifulSoup(mk, ‘xmI’) | pip install lxml |
html5lib的解析器 | BeautifulSoup(mk, ‘html5lib’) | pip install html5lib |
Beautiful Soup类的基本元素:
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾 |
Name | 标签的名字,< p >…< /p >的名字是’p’,格式:< tag >.name |
Attributes | 标签的属性,字典形式组织,格式:< tag >.attrs |
NavigableString | 标签内非属性字符串,<>…</>中字符串,格式:< tag >.string |
Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
接下来我们用下面这个 HTML页面来获取 Beautiful Soup类的基本元素:
http://python123.io/ws/demo.html
import requests
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text
获得tag标签的相关方法:
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, "html.parser")
print(soup.title)
tag = soup.a
print(tag)
文本中存在两类标签,只点击soup.a,只能获得其中第一个标签内容。
获取标签名字的方法:
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, "html.parser")
print(soup.a.name)
print(soup.a.parent.name)
print(soup.a.parent.parent.name)
获取标签属性:
tag = soup.a
print(tag.attrs)
print(tag.attrs['class'])
print(tag.attrs['href'])
type(tag.attrs)
type(tag)
获取标签的NavigableString元素:
print(soup.a)
print(soup.a.string)
print(soup.p)
print(soup.p.string)
type(soup.p.string)
在p标签中实际还包含了一个b标签,但是当我们输出 soup.p.string 的时候,打印的并不包含b标签,这说明 NavigableString 是可以跨越多个标签层次的。
获取Comment类型:
newsoup = BeautifulSoup("<b><!--This is a comment--></b><p>This is not a comment</p>", "html.parser")
print(newsoup.b.string)
type(newsoup.b.string)
print(newsoup.p.string)
type(newsoup.p.string)
我们对 b标签和 p标签分别用 .string 的时候,都能产生一段文本,但是当这段文本是注释形式的时候,它并没有标明它是注释,也就是说它的尖括号、感叹号被去掉了。所以在我们分析文档的时候,我们需要对其中的注释部分做相关的判断,判断的依据就是它的类型。
总结:
- 用 .tag 获得标签信息
- 用 .name 获得标签名字
- 用 .attrs 获得标签属性
无论一个标签是否存在属性,都会返回一个字典类型(空字典)
- 用 .string 获得非属性字符串/注释
获取过程中,如果其中存在注释,那么它会返回一种特殊的注释类型,如果我们不希望提取注释信息,需要对这种类型做相关的判断。
参考资料:Python网络爬虫与信息提取(北京理工大学慕课)