首页 > 代码库 > 从BeautifulSoup说起
从BeautifulSoup说起
BeautifulSoup是解析、遍历、维护“标签树”的功能库
一、html基础
1. HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的.
举个栗子:<h1>这是一个标题</h1> <h2>这是一个标题</h2> <h3>这是一个标题</h3>
2. HTML 段落是通过标签 <p> 来定义的.
举个栗子:<p>这是一个段落。</p> <p>这是另外一个段落。</p>
3. HTML 链接 HTML 链接是通过标签 <a> 来定义的.
举个栗子:<a href="http://www.runoob.com">这是一个链接</a>
4. HTML 图像是通过标签 <img> 来定义的.
注意: 图像的名称和尺寸是以属性的形式提供的。
5. <body>定义了一个主 体
一般而言,html的结构为:
<html> 标签树
<body>
<p class = "title">....</p>
<body>
</html>
示意图如下
二、正式说beutifulSoup库
1. 一般导入用 from bs4 import BeautifulSoup
2. BeautifulSoup类的五个基本元素(每个部分即对应html的一个部分)
3. tag的方法:soup.<tag>访问获得HTML中的标签,当HTML文档中存在多个相同的<tag>对应的内容时,soup.<tag>返回第一个
下面以这段html源码为例子:
1 <html><head><title>This is a python demo page</title></head>
2 <body>
3 <p class="title"><b>The demo python introduces several python courses.</b></p>
4 <p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
5 <a href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and <a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>.</p>
6 </body></html>
python代码,导入模块
import requests
from bs4 import BeautifulSoup
r = requests.get("http://python123.io/demo.html")
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
taga = soup.a ###即a标签的内容
3.1 <tag>.name 标签的名字,得到的为字符串类型,<p>...</p>的名字为p
eg.
soup.a.name
>>‘a‘
3.2 <tag>.attrs 标签的属性,字典形式的组织
taga = soup.a
taga.attrs ##由此可见一个标签可以有多个属性
>>{‘id‘ : ‘link1‘, ‘class‘ : [‘py1‘], ‘href‘ : ‘http://.....‘}
taga.attrs[id] #标签的属性为字典类型,从而属性是成对出现
>>link1
3.3 <tag>.string 标签内非属性字符串(NavigableString),他有时可以跨越多个层次, 结果是<>....</>中的字符串,尖括号内的内容可能是单单一个标签名,也可能是加了一大堆属性
eg.
3.4 tag的comment,标签内字符串的注释部分,一种特殊的comment类
总结起来就是最后这幅图,而且后三种元素都相当与在tag之下才能使用,分别可以用到标签名,属性,NavigableString,commen
三、标签树遍历方法
1 标签树的下行遍历
1.1 下行遍历主要是三种方法:<tag>.contents、children、descendants
<tag>.contents 子节点的列表,将<tag>所有子节点存入列表
.children子节点的迭代类型,与.contents类似,用于循环遍历子节点
.desendants子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
下行遍历的两个方法
1.2 (1)遍历子节点
for child in soup.body.contents
print(child)
(2)遍历孙节点
for child in soup.body.descendants:
print(child)
2 标签树的上行遍历
2.1 上行遍历的两个方法:<tag>.parent,<tag>.parents
.parent 节点的父亲标签
parents节点先辈标签的迭代类型,用于循环遍历先辈节点
2.2 上行遍历的例子
soup=BeautifulSoup(demo,"html.parser")
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(parent.name)
此方法会遍历先辈节点,包括soup本身,所以要区别判断
3. 标签树的平行遍历(平行的前提是在同一个父节点下边)
3.1 标签树平行遍历的属性
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling返回按照HTML文本顺序的上一个平行节点标签
.next_siblings迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings迭代类型,返回按照HTML文本顺序的前续所有平行节点标签
3.2 平行遍历的两种方法
遍历前序节点
for ping in soup.a.previous_sibling:
print(ping)
for ping in soup.a.next_sibling:#遍历后续节点
print(ping)
四、BeautifulSoup库的四种解析器
从BeautifulSoup说起