CM_Bill
想搞机🕹的🧪化学生
Call Me Bill
Week 2 Unit 1 BeautifulSoup 库入门

0 基本知识

0.1 引入

from bs4 import BeautifulSoup

从 bs4 库中引入 BeautifulSoup 类(注意区分大小写)。

0.2 基本用法

首先要爬取到一个页面的源代码,这里以课程中的 http://python123.io/ws/demo.html 为例:

import requests from bs4
import BeautifulSoup #从bs4库中引入BeautifulSoup类
r = requests.get('http://python123.io/ws/demo.html')
demo = r.text
soup = BeautifulSoup(demo,'html.parser')
soup.a #得到(第一个)a标签
soup.a.name #得到标签的名字
soup.a.parent.name #得到标签的父标签

即可看到煮好的“汤”。

0.3 标签的处理

在上方代码的基础上

tag = soup.a #读取第一个a标签并且放进tag中
tag.name #标签的名字
tag.attrs #标签的属性,返回的是字典
tag.string
#对于迭代类型的下行遍历
for child in soup.body.children:
    print(child)
for child in soup.body.descendants:
    print(child)

即可以对标签进行初步的处理。

1 遍历

HTML中的标签构成了树形结构,具有所属关系。在获取各个标签时便有多种遍历方法,包括下行遍历、上行遍历和平行遍历。

1.1 下行遍历

还是以上面的代码为基础,下行遍历有以下三个方法

tag.contents #将所有的子节点存入列表
tag.children #与contents类似,但是返回的是迭代类型,比如用于for中
tag.descendants #迭代类型,但是包含所有子孙节点

1.2 上行遍历

同样的,上行遍历有下面两种办法:

tag.parent
tag.parents #为迭代类型,用于循环遍历
#上行遍历的迭代循环
for parent in soup.a.parents:
    if parent is None:#此处的处理是由于遍历所有父辈节点时会包括soup本身,因此区别判断
        print(parent)
    else:
        print(parent.name)

1.3 平行遍历

平行遍历必须在同一个父节点下发生,有以下四种方法:

tag.next_sibling #按照文本顺序遍历下一个
tag.previous_sibling #上一个
tag.next_siblings #迭代类型,后续的所有平行节点
tag.previous_siblings

2 让输出的HTML内容更好看

采用 bs4 库的 prettify() 方法,能够对HTML代码进行简单修改,通过增加 \n 的方法提升输出后的代码可读性。在IDLE中:

>>> import requests
>>> from bs4 import BeautifulSoup
>>> r = requests.get('http://python123.io/ws/demo.html')
>>> demo = r.text
>>> demo
'<html><head><title>This is a python demo page</title></head>\r\n<body>\r\n<p class="title"><b>The demo python introduces several python courses.</b></p>\r\n<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:\r\n<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>\r\n</body></html>'
>>> soup = BeautifulSoup(demo,'html.parser')
>>> soup.prettify()
'<html>\n <head>\n  <title>\n   This is a python demo page\n  </title>\n </head>\n <body>\n  <p class="title">\n   <b>\n    The demo python introduces several python courses.\n   </b>\n  </p>\n  <p class="course">\n   Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:\n   <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">\n    Basic Python\n   </a>\n   and\n   <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">\n    Advanced Python\n   </a>\n   .\n  </p>\n </body>\n</html>'
>>> print(soup.prettify())
<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>
>>>

 
可以看到,通过 prettify() 方法后,由于 \n 的增加使得代码间出现了换行,使得print得到的结果更具可读性。

发表评论

textsms
account_circle
email

Call Me Bill

Week 2 Unit 1 BeautifulSoup 库入门
第二周第一单元的Python学习笔记,主要是BeautifulSoup库的入门使用。
扫描二维码继续阅读
2020-03-26
近期文章
近期评论