MOOC《Python网络爬虫和信息提取》(第11次)网络爬虫之提取(第2周)

MOOC《Python网络爬虫和信息提取》(第11次)

网络爬虫之提取 21.07.31

学习目标

  • 解析HTML页面以及信号标记与提取方法
  • BeautifulSoup库
  • 1个实战项目Projects

目录

单元4:Beautiful Soup库入门

4.1、Beautiful Soup库的安装

pip install beautifulsoup4

pycharm环境下的安装

打开设置->选择Project的Python interpreter->点击添加

在这里插入图片描述

输入beautifulsoup4->点击左下角install,等待片刻,安装完毕

在这里插入图片描述

安装小测

网页地址:http://python123.io/ws/demo.html

import requests
from bs4 import  BeautifulSoup

r = requests.get('http://python123.io/ws/demo.html')
# print(r.text)
demo = r.text
soup = BeautifulSoup(demo, 'html.parser')
print(soup.prettify())

# 能输出即代表安装完成

4.2、Beautiful Soup库的基本元素

4.2.1 Beautif Soup库的理解

在这里插入图片描述

4.2.2 Beautiful Soup库的解析器种类

解析器使用方法条件
bs4的HTML解析器BeautifulSoup(mk,’html.parser’)安装bs4库
lxml的HTML解析器BeautifulSoup(mk,’lxml’)pip install lxml
lxml的XML解析器BeautifulSoup(mk,’lxml’)pip install lxml
html5lib的解析器BeautifulSoup(mk,’html5lib’)pip install html5lib

4.2.3 Beautiful Soup类的基本元素

基本元素说明
Tag标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
Name标签的名字,

的名字是’p’,格式:.name
Attributes标签的属性,字典形式组织,格式:.attrs
NavigableString标签内非属性字符串,<>…</>中字符串,格式:.string
Comment标签内字符串的注释部分,—种特殊的comment类型,通过type(soup..string)查看

在这里插入图片描述

4.3、基于bs4库的HTML内容遍历方法

4.3.1 HTML基本格式

在这里插入图片描述

在这里插入图片描述

4.3.2 下行遍历

属性说明
.contents子节点的列表,将所有儿子节点存入列表
.children子节点的迭代类型,与.contents类似,用于循环遍历儿子节点(for…in)
.descendants子孙节点的迭代类型,包含所有子孙节点,用于循环遍历(for…in)
# 导入库,做汤
import requests
from bs4 import BeautifulSoup

r = requests.get('http://python123.io/ws/demo.html')
demo = r.text
soup = BeautifulSoup(demo, 'html.parser')

# /*************
# 下行遍历
# **************/

print(soup.body.contents)       # 子节点列表
print(len(soup.body.contents))  # 子节点列表的长度
print(soup.body.contents[1])    # 访问body的第二个节点

count =1  # 便于显示输出状态
for child in soup.body.children:
    print(count,child)	# 遍历儿子节点
    count +=1

count=1
for child in soup.body.descendants:
    print(count,child)    # 遍历子孙节点,比children多输出一遍子孙节点
    count +=1

4.3.3 上行遍历

属性说明
.parent节点的父亲标签
.parents节点的标签的迭代类型,用于循环遍历先辈节点(for…in)
# /*************
# 上行遍历
# **************/

print(soup.title.parent)
    # <head><title>This is a python demo page</title></head>
print(soup.html.parent) 	# 最高级标签,输出自己
print(soup.parent)				# None

# 对<a>标签的所有先辈进行打印
for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)
# p
# body
# html
# [document]

4.3.4 平行遍历

属性说明
.next_sibling返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling返回按照HTML文本顺序的上一个平行节点标签
.next_siblings迭代类型,返回按照HTML文本顺序的后续所有平行节点标签(for…in)
.previous_siblings迭代类型,返回按照HTML文本顺序的前续所有平行节点标签(for…in)

在这里插入图片描述

# /*************
# 平行遍历
# **************/

'''
与<a>标签同行的标签结构:
<p>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>
'''

print(soup.a.next_sibling)   
    # 'and'
print(soup.a.next_sibling.next_sibling)
    # <a class="py2" ... </a>

print(soup.a.previous_sibling)
    # Python is a wonderful ... following courses:
print(soup.a.previous_sibling.previous_sibling)
    # None
    
for sibling in soup.a.next_siblings:
    print(sibling)  # 遍历后续节点

for sibling in soup.a.previous_siblings:
    print(sibling)  # 遍历前续节点

总结:

在这里插入图片描述

4.4、基于bs4库的HTML格式化和编码

bs4库的prettify()方法

.prettify()为HTML文本<>及其内容增加换行符,便于人的阅读及程序读取和分析信息

bs4库的编码

bs4库将任何HTML输入都变成utf-8编码

单元5:信息组织与提取方法

5.1、信息标记的三种形式

HTML的信息标记:

HTML通过预定义的<>…</>标签形式组织不同类型的信息

5.1.1 XML

与HTML类似,以标签<>为主表达信息,…

空元素缩写:

注释书写:

在这里插入图片描述

5.1.2 JSON

有类型的键值对: “key”:”value”

可以有多个值:“key”:[”value1”,”value2”]

键值对可嵌套:“key”:{”subkey”:”subvalue”}

在这里插入图片描述

5.1.3 YAML

无类型键值对:key : value

缩进表达从属关系:

key :

​ subkey : subvalue

‘-’表达并列关系:

key :

-value1

-value2

| 表达整块数据,# 表示注释

key :| #Comment

text
在这里插入图片描述

5.2、三种信息标记的比较

类型说明
XMLInternet上的信息交互与传递
JSON移动应用云端和节点的信息通信,无注释
YAML各类系统的配置文件,有注释易读

5.3、信息提取的一般方法

5.3.1 方法一

方法一:完整解析信息的标记形式,再提取关键信息

优点:信息解析准确

缺点:提取过程繁琐,速度慢

5.3.2 方法二

方法二:无视标记形式,直接搜索关键信息

优点:提取过程简介,速度较快

缺点:提取结果准确性与信息内容相关

5.3.3 融合方法

# 提取HTML中所有URL链接

import requests
from bs4 import BeautifulSoup

r = requests.get('http://python123.io/ws/demo.html')
demo = r.text
soup = BeautifulSoup(demo, 'html.parser')  # 完整解析信息

for link in  soup.find_all('a'):    # 搜索所有<a>标签
    print(link.get('href'))     # 打印href的链接内容

# http://www.icourse163.org/course/BIT-268001
# http://www.icourse163.org/course/BIT-1001870001

5.4、基于bs4的HTML内容查找方法

**<>.find_all(name,attrs,recursive,string,kwargs)

  • name:对标签名称的检索字符串
  • arrts:对标签属性值的检索字符串,可标注属性检索
  • recursive:是否对子孙 全部检索,默认True
  • string:<>…</>中字符串趋于的检索字符串

简写形式:

(…) 等价于 <>.find_all(…)

soup(…) 等价于 soup.find.all(…)

扩展方法

参数同find_all()参数

方法说明
<>.find()搜索且只返回一个结果
<>.find()_parents()在先辈节点中搜索,返回列表类型
<>.find()_parent()在先辈节点中返回一个结果
<>.find()_next_siblings()在后续平行节点中搜索,返回列表类型
<>.find()_next_sibling()在后续平行节点中返回一个结果
<>.find()_previous_siblings()在前续平行节点中搜索,返回列表类型
<>.find()_previous_sibling()在前续节点中返回一个结果

单元6:Beautiful Soup库的实例

实例1:中国大学排名定向爬虫

功能描述:

输入:大学排名URL链接

输出:大学排名信息的屏幕输出(排名,大学名称,总分)

技术路线:reques-bs4

定向爬虫:进队输入URL进行爬取,不扩展爬取

'''
程序的结构设计
步骤1:从网络上获取大学排名网页内容  getHTMLText()
步骤2:提取网页内容中信息到合适的数据结构   fillUnivList()
步骤3:利用数据结构展示并输出结果   printUnivList()
'''

import requests
from bs4 import BeautifulSoup
import bs4


def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""


def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.body.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].text.strip(), tds[2].string.strip()])	
# 用string读取时,第4所上海交通大学是子标签<a>内容,会录入None导致无法打印

# def printUnivList(ulist, num):
#     print("{:^10}\t{:^10}\t{:^10}".format("排名", "学校名称", "评估结果"))
#     for i in range(num):
#         u = ulist[i+1]
#         print("{:^10}\t{:^10}\t{:^10}".format(u[0], u[1], u[2]))

def printUnivList(ulist, num):        # 中英文混排输出问题优化
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print("2021-2022通信与信息系统考研学校排名(定向爬取)")
    print(tplt.format("排名", "学校名称", "评估结果", chr(12288)))
    for i in range(num):
        u = ulist[i+1]	# list[0]为标题,从1开始打印数据
        print(tplt.format(u[0], u[1], u[2], chr(12288)))

def main():
    uinfo = []
    url = 'https://www.dxsbb.com/news/3259.html'    # 2021-2022通信与信息系统考研学校排名
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)  # 20 univs
main()

测验2: Python网络爬虫之提取 (第2周)

1、下面哪个Python库不能用于提取网页信息?‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、lxml

B、Beautiful Soup

C、requests

D、re

正确答案 C

requests是爬虫库,只用于获取页面,不对页面信息进行提取。

2、下面代码中,BeautifulSoup指什么?‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

for bs4 import BeaytufulSoup

A、Python第三方库的名字

B、用户定义的变量名称

C、类的名称

D、bs4库中的一个函数名称

正确答案 C

python from bs4 import BeautifulSoup

指从bs4库中引入一个元素(函数或类),这里BeautifulSoup是类。

3、在bs4库中,下面说法错误的是:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、一个HTML文档可以包含多个标签树

B、一个HTML文档与一个标签树等价

C、一个HTML文档与BeautifulSoup对象等价

D、标签树上除了标签外,节点还可能是字符串(NavigableString)类型。

正确答案 A

一个文档只对应一个标签树

4、下面代码中,href属于哪个类别?‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫

<a  class="title" href="https://python123.io/ws/demo.html">TEXT</a>

A、属性

B、字符串

C、名称

D、标签

正确答案 A

a是标签,href是属性。

5、获得soup对象中,能够获得a标签全部属性的代码是:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

from bs4 import BeautifulSoup
soup = BeautifulSoup(demo,'html.parser')

A、soup.a.attrs

B、soup.a[0].attrs

C、soup.a.attrs[]

D、soup.a.attrs[0]

正确答案 A

a标签是HTML预定义标签,通过soup.a可以直接获取。

6、下面哪个不是信息提取的思路?‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、通过自然语言处理方式找到所需提取的信息。

B、结合部分格式解析和搜索的方式提取所需要的信息。

C、无视格式,直接搜索找到所需提取的信息。

D、按照信息格式完全解析,解析后找到所需提取的信息。

正确答案 A

自然语言理解一般针对语言文本,HTML等信息标记格式产生的文本需要采用信息提取方式获得语言文本,才使用自然语言理解方式进一步处理(如果有需要的话)。

7、为什么Beautiful Soup库叫这个名字?‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、开发者喜欢煲汤

B、原因不详,第三方库起名原因多种多样,没必要深究

C、Python Software Foundation要求开发者叫这个名字

D、之前有类似的库叫类似的名字

正确答案 B

Python计算生态采用"集市"模式,命名权归贡献者。

8、Beautiful Soup库不可加载的解析器是:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、html5lib

B、re

C、html.parser

D、lxml

正确答案 B

bs4解析器是能够解释HTML或XML的一个第三方库,re是用来表达并匹配正则表达式的,不能够装载到bs4库中。

9、不属于bs4库遍历标签树方法的是:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、跳跃遍历

B、平行遍历

C、下行遍历

D、上行遍历

正确答案 A

遍历树一般没有"跳跃遍历"。

10、关于Beautiful Soup库说法错误的是:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、Beautiful Soup库也叫bs4库

B、Beautiful Soup库是解析、遍历、维护标签树的功能库

C、Beautiful Soup库可常用于生成标签树

D、Beautiful Soup库能够对HTML和XML等格式进行解析

正确答案 C

Beautiful Soup库不能够生成标签树,只能解析、遍历和维护。

资料来源:

Python网络爬虫与信息提取_北京理工大学_中国大学MOOC(慕课) https://www.icourse163.org/course/BIT-1001870001
不属于bs4库遍历标签树方法的是:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、跳跃遍历

B、平行遍历

C、下行遍历

D、上行遍历

正确答案 A

遍历树一般没有"跳跃遍历"。

10、关于Beautiful Soup库说法错误的是:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

A、Beautiful Soup库也叫bs4库

B、Beautiful Soup库是解析、遍历、维护标签树的功能库

C、Beautiful Soup库可常用于生成标签树

D、Beautiful Soup库能够对HTML和XML等格式进行解析

正确答案 C

Beautiful Soup库不能够生成标签树,只能解析、遍历和维护。

资料来源:

Python网络爬虫与信息提取_北京理工大学_中国大学MOOC(慕课) https://www.icourse163.org/course/BIT-1001870001

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值