BeatutifulSoup
先从标签说起
-
标签又叫Tag,是书写前端网页的语言标记。下图是你看到的网页,背后是无数的标签构成的,每一个标签规定不同的属性,如确定文字大小位置等。
-
组成:以 < p class = “title”>这是标签 < /p>为例
- < p > … < /p >,这一个成对的符号就是标签,p就是标签名称。一般特定名称的标签有特定的功能,不可乱用,若有意,自己了解一下
- 内部的“ class = “title” ”就是标签的属性,修饰标签的大小,颜色等特定的属性
- “…”是标签内的非属性字符串,一般是用来输出显示的
-
多个标签组成的叫做“标签树”,一个网页就是一个标签树
什么是BeautifulSoup类
- 下面是获取百度的网页内容,以text格式输出。发现你根本阅读不了,里面是没有格式混乱的标签。
- 下面是对应的在浏览器开发者模式下打开的百度网页的源码。你会发现很友好的,是有格式的标签。
- 通过比对,你会发现,原来混乱的标签变的有格式的,可以阅读了。问题来了,浏览器可以将标签格式化,输入到爬虫中怎么将对应的标签语言格式化?
- BeautifulSoup应运而生,将python爬取回来的网页混乱的源码变成漂亮的可读的格式,生成标签树
使用
- 准备好煲汤的材料,response.text对象
from bs4 import BeautifulSoup
import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
- 将材料加入锅里,选择材料的格式html(看看你的网页是什么格式)
soup = BeautifulSoup(demo,"html.parser")
- 根据上文你的soup是一个完整的标签树,你可以获取标签树里面的任何内容
print(soup.prettify())
# 输出完整的标签树
print(soup.title)
# 输出标签名为title的标签
print(soup.a.name)
# 输出标签名
print(soup.a.attrs)
# 获得标签属性的信息
print(soup.a.string)
# 输出标签中间的字符串
一个html网页就是一个标签树——如何有效地遍历
- 如下图,对应的html网页的基本框架如下图,你可以根据树来理解
- 箭头的头是儿子结点,箭头的为是父亲节点,父节点在上,儿子结点在下。title是head的儿子结点,head是title的父亲节点
- 遍历方式,按照树的形状才可有效的进行遍历
- 先讲讲自上而下进行遍历
- 常用方法
属性 | 说明 |
---|---|
< tag >.contents | 子节点的列表,将< tag >所有的儿子结点存入列表 |
< tag >.children | 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点 |
< tag >.descendants | 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
- 先给我一个出发点,调用contents直接输出所有的儿子结点
from bs4 import BeautifulSoup
import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
print(soup.head.contents)
图示,以列表的形式输出所有的儿子标签:
- < tag >.children迭代的使用,用于遍历儿子标签
for i in soup.body.children:
print(i)
图示,循环遍历儿子节点
- < tag >.descendants迭代的使用,用于遍历孙子标签
for i in soup.body.descendants:
print(i)
图示,遍历的不仅仅是儿子节点,更是孙子节点
如果不信,你可以参考一下,下面完整的树
<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 >…parent | 节点的父亲标签 |
< tag >.parents | 节点先辈标签的迭代类型,用于循环遍历先辈节点 |
- < tag >.parent标签的使用
print(soup.head.parent)
图示,为对应的父亲节点,注意这是一个大的节点,< html >< / html >节点
- < tag >.parents 迭代的使用
for parent in soup.p.parents:
print(parent.name)
图示,迭代的出现,包括了soup类本身
- 最后讲讲平行遍历 ,平行遍历是同一个父亲节点的。类似的方法同上
属性 | 说明 |
---|---|
< tag >.next_sibling | 返回html文本顺序的下一个平行节点标签 |
< tag >.previous_sibling | 返回html文本顺序上一个平行的节点的标签 |
< tag >.next_siblings | 迭代类型,返回按照html顺序的所有的后续平行结点的标签 |
< tag >.previous_siblings | 迭代类型,返回按照html顺序的所有的前继平行结点的标签 |
- 最后就是如何完整的显示一个html树
属性 | 说明 |
---|---|
< tag >.prettify() | 完整的显示一个html树 |
print(soup.body.prettify())
图示,显示了body棵树的全体
转载:https://blog.csdn.net/Blackoutdragon/article/details/106087520
查看评论