飞道的博客

python爬虫的BeautifulSoup的使用方法(自己精简的,只留下了实用的)

610人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场