Advertisement

北京理工大学MOOC爬虫笔记二(第2周)

阅读量:

目录

一、BeautifulSoup库

二、信息标记与提取方法

三、实例(静态获取)


一、BeautifulSoup库

(1)BeautifulSoup库:解析、遍历、维护“标签树”的功能库

(2)采用BeautifulSoup库:
from bs4 import BeautifulSoup
soup = BeautifulSoup('

数据

', 'html.parser')

(3)BeautifulSoup对应一个HTML/XML文档的全部内容

复制代码
 demo:

    
 #查看标签内容
    
 import requests
    
 r = requests.get('https://python123.io/ws/demo.html')
    
 #print(r.text)
    
 demo=r.text
    
 from bs4 import BeautifulSoup
    
 soup = BeautifulSoup(demo,'html.parser')
    
 print(soup.title)#<title>This is a python demo page</title>
    
  
    
 #name标签的名字
    
 tag=soup.a
    
 print(tag)#<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
    
 print(soup.a.name)#a
    
 print(soup.a.parent.name)#p
    
 print(soup.a.parent.parent.name)#body
    
  
    
 #attrs标签的属性
    
 print(tag.attrs)
    
 print(tag.attrs['class'])
    
 print(tag.attrs['href'])
    
  
    
 #标签属性的类型
    
 print(type(tag.attrs))#<class 'dict'>字典类型
    
 print(type(tag))#<class 'bs4.element.Tag'>
    
  
    
 #Tag的NavigableString标签内非属性字符串
    
 print(soup.a.string)#Basic Python
    
 print(soup.p)#<p class="title"><b>The demo python introduces several python courses.</b></p>
    
 #NavigableString可以跨越多个层次
    
 print(type(soup.p.string))#<class 'bs4.element.NavigableString'>
    
  
    
 #Tag的Comment
    
 newsoup = BeautifulSoup("<b><!--This is a comment--></b><p>This is not a comment</p>","html.parser")
    
 print(newsoup.b.string)#This is a comment
    
 print(type(newsoup.b.string))#<class 'bs4.element.Comment'>
    
 print(newsoup.p.string)#This is not a comment
    
 print(type(newsoup.p.string))#<class 'bs4.element.NavigableString'>
复制代码
 demo:

    
 import requests
    
 from bs4 import BeautifulSoup
    
 r = requests.get('https://python123.io/ws/demo.html')
    
  
    
 #print(r.text)
    
 demo=r.text
    
 soup = BeautifulSoup(demo,"html.parser")
    
 tag=soup.a
    
  
    
 #下行遍历
    
 #遍历儿子节点
    
 for child in soup.body.children:
    
     print(child)
    
 #遍历子孙节点
    
 for child in soup.body.descendants:
    
     print(child)
    
  
    
 #上行遍历
    
 #.parent返回节点父亲标签
    
 print(soup.title)#<title>This is a python demo page</title>
    
 print(soup.title.parent)#<head><title>This is a python demo page</title></head>
    
 #html标签的父亲
    
 print(soup.html.parent)
    
 #标签树的上行遍历
    
 for parent in soup.a.parents:
    
     if parent is None:
    
     print(parent)
    
     else:
    
     print(parent.name)
    
  
    
 #平行遍历
    
 print(soup.a.next_sibling)# and
    
 print(soup.a.next_sibling.next_sibling)#<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>
    
 print(soup.a.previous_sibling)
    
 #遍历后续节点
    
 for sibling in soup.a.next_siblings:
    
     print(sibling)
    
 #遍历前续节点
    
 for sibling in soup.a.previous_siblings:
    
     print(sibling)

二、信息标记与提取方法

<...find_all(...): 生成一个列表来存储查找结果
name: 定义标签名称匹配的标准
attrs: 设置标签属性值匹配的要求(支持标记属性处理)
recursive: 决定递归搜索子节点的情况,默认选择全选
string: 在<...>内容范围内进行匹配设置

demo:

复制代码
 import requests

    
 from bs4 import BeautifulSoup
    
 r = requests.get('https://python123.io/ws/demo.html')
    
 demo=r.text
    
 soup = BeautifulSoup(demo,"html.parser")
    
 tag=soup.a
复制代码
 #HTML中所有的超链接,首先找到a标签,其次搜索关键信息’href’

    
 for link in soup.find_all('a'):
    
     print(link.get('href'))
    
  
    
 #name : 对标签名称的检索字符串
    
 for tag in soup.find_all(True):
    
     print(tag.name)
    
  
    
 #查找a,b标签,一列表形式给出
    
 print(soup.find_all('a'))
    
 print(soup.find_all(['a', 'b']))
    
  
    
  
    
 for tag in soup.find_all(True):  # 显示所有的标签信息
    
     print(tag.name)
    
   
    
 # 引入正则表达式库
    
 import re
    
  
    
 # 返回一个列表类型
    
 print(soup.find_all('p', 'course') )
    
 # 返回一个列表
    
 print(soup.find_all(id='link1'))
    
 # 返回一个空列表,因为没有link元素,要用正则表达式库
    
 print(soup.find_all(id='link'))
    
 # 用了正则表达式,返回包含link的列表
    
 print(soup.find_all(id=re.compile('link')))
    
 #检索字符串信息
    
 print(soup.find_all(string="Basic Python"))
    
 #正则表达式类似于模糊查询
    
 print(soup.find_all(string=re.compile('Python')))

三、实例(静态获取)

复制代码
 demo:

    
 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 ""
    
  
    
 #key提取关键数据
    
 #先找到tbody标签之后,之后找到tr标签,找到td信息
    
 def fillUnivList(ulist,html):
    
     soup = BeautifulSoup(html, 'html.parser')
    
     for tr in soup.find('tbody').children:
    
    #不是tag类型过滤掉
    
    if isinstance(tr,bs4.element.Tag):
    
        tds=tr('td')
    
        #append() takes exactly one argument (3 given)
    
        ulist.append([tds[0].string, tds[1].string, tds[2].string])
    
  
    
  
    
 def  printUnivList(ulist,num):
    
     print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))
    
     for i in range(num):
    
     u = ulist[i]
    
     print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))
    
  
    
 def main():
    
     uinfo = []
    
     url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
    
     html = getHTMLText(url)
    
     fillUnivList(uinfo, html)
    
     printUnivList(uinfo, 20)  # 20个大学
    
  
    
 main()

输出结果:

输出不整齐,改进:

printUnivList(ulist,num)修改成下面这个即可:

复制代码
 def printUnivList(ulist,num):

    
     tplt="{0:^10}\t{1:{3}^10}\t{2:^10}"
    
     print(tplt.format("排名","学校名称","总分",chr(12288)))
    
     for i in range(num):
    
     u=ulist[i]
    
     print(tplt.format(u[0],u[1],u[2],chr(12288)))

输出结果:

1

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

A

Beautiful Soup

B

re

C

lxml

D

requests

正确答案 D

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

2

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

复制代码

A

Python第三方库的名字

B

类的名称

C

用户定义的变量名称

D

bs4库中的一个函数名称

正确答案 B

复制代码
    from bs4 import BeautifulSoup

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

3

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

A

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

B

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

C

一个HTML文档与BeautifulSoup对象等价

D

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

正确答案 D

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

4

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

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

复制代码

A

名称

B

字符串

C

属性

D

标签

正确答案 C

a是标签,href是属性。

5

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

复制代码

A

  1. soup.a.attrs[0]

B

  1. soup.a.attrs

C

  1. soup.a.attrs[]

D

  1. soup.a[0].attrs

正确答案 B

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

6

1 分

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

A

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

B

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

C

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

D

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

正确答案 A

自然语言理解主要应用于语言文本;而由HTML等信息标记格式产生的文本则必须经过信息提取手段获取其对应的语言文本,在必要时才可应用自然语言理解的方式进行进一步处理。

7

1 分

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

A

开发者喜欢煲汤

B

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

C

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

D

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

正确答案 B

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

8

1 分

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

A

re

B

html5lib

C

html.parser

D

lxml

正确答案 A

bs4工具可用来解析HTML或XML文件。
re用于表示和匹配正则表达式模式。
无法导入到bs4库中。

9

1 分

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

A

上行遍历

B

平行遍历

C

下行遍历

D

跳跃遍历

正确答案 D

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

10

1 分

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

A

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

B

Beautiful Soup库也叫bs4库

C

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

D

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

正确答案 A

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

全部评论 (0)

还没有任何评论哟~