首页 > > > Python初步学习,认识BeautifulSoup
BeautifulSoup将HTML转成树形结构,树的每个节点都是Python的对象。
? ? ? ? ? ?我们知道HTML是标记类的语言,代码通过标签对开始,标签对结束来实现, 而BeautifulSoup就是基于这样的标签,来构建一个“标签树”,从而可以便利地解析、遍历、维护“标签树”的功能库。
? ? ? ? ? ? ? 在BeautifulSoup提供了多种解析器,原理都是通过构建标签树来实现对标记类语言的解析、遍历和维护,只要Python安装对应的库就可以使用了。
? ? ? ? ? ? ? 再来看看BeautifulSoup提供的基本元素,理解这些之后,我们就能用BeautifulSoup来操作HTML的内容啦,这里的comment是一个特殊的NavigableString对象,只是输出的部分不包括注释符号。
import requests
from bs4 import BeautifulSoup
r = requests.get("http://python123.io/ws/demo.html")
# 现在的dom节点不会成树状图的
demo = r.text
# 使用html.parser,要安装bs4库,给demo排好序成一个有节点的树状图
soup = BeautifulSoup(demo, "html.parser")
# 排好序之后 只要用prettify()这个方法就能打印出HTML的标准格式
print(soup.prettify())
# 获取dom元素titile的内容包括title标签也会打印出来
print(soup.title)
# 获取dom元素titile的字符串内容
print(soup.title.string)
# 打印的结果
The demo python introduces several python courses.
Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
Basic Python
and
Advanced Python
.
?
BeautifulSoup中HTML内容的基本遍历方法:
? ? ? ? ? ? ?我们先来看HTML标签树及其基本的遍历方法,其中包括: 下行遍历 、 上行遍历和 平行遍历 ,我们可以从下图中理解三种遍历的基本思想。
? ? ? ? ? ? 我们先来看看下行遍历的基本元属性,其中.contents和.children只获得当前节点的下一层节点的信息,而.descendants可以获得一个节点后续的所有节点的信息。
我们还是用上面的那个soup,现在用代码来实践一下:
soup.head
# 输出结果是:
我们会发现返回结果被保存到了一个列表里,而.children和.descendants用于遍历则不会保存到列表中,请多加注意,所以,
# 我们可以用for in来循环其中的值,如:
for i in soup.head.descendants:
print(i)
# 输出是:
This is a python demo page
# 我们可以发现字符内容也被当做一个子节点。
上行遍历,上行遍历包括以下的属性,其基本的内容和上行遍历一致:
我们可以用以下代码进行简单的测试:
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(parent.name)
# 输出结果是:
p
body
html
[document]
这里值得注意的是,当遍历到最上层的parent, 而这个parent本身没有parent,这时候则要进行一个判断:parent是否为空。
最后来看看平行遍历:
其基本的使用与上行下行思想基本一致,但值得注意的是,平行遍历是要求在同一个父节点的各个节点之间的遍历。
这里主要展示用for in来遍历后续节点,如下:
for sibling in soup.a.next_siblings:
print(sibling)
输出结果是:
?
and?
Advanced Python
.
这里我们知道, 平行遍历的节点也可能是string。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4328/viewspace-3126237/ ,如需转载,请注明出处,否则将追究法律责任。