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

目录

一、BeautifulSoup库

        二、信息标记与提取方法

        三、实例(静态获取)


一、BeautifulSoup库

北京理工大学MOOC爬虫笔记二(第2周)_第1张图片

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

(2)使用BeautifulSoup库:
     from bs4 import BeautifulSoup
     soup=BeautifulSoup(’< p>data,‘html.parser’)

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

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

北京理工大学MOOC爬虫笔记二(第2周)_第3张图片

北京理工大学MOOC爬虫笔记二(第2周)_第4张图片

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)#This is a python demo page

#name标签的名字
tag=soup.a
print(tag)#Basic Python
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))#字典类型
print(type(tag))#

#Tag的NavigableString标签内非属性字符串
print(soup.a.string)#Basic Python
print(soup.p)#

The demo python introduces several python courses.

#NavigableString可以跨越多个层次 print(type(soup.p.string))# #Tag的Comment newsoup = BeautifulSoup("

This is not a comment

","html.parser") print(newsoup.b.string)#This is a comment print(type(newsoup.b.string))# print(newsoup.p.string)#This is not a comment print(type(newsoup.p.string))#

北京理工大学MOOC爬虫笔记二(第2周)_第5张图片

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)#This is a python demo page
print(soup.title.parent)#This is a python demo page
#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)#Advanced Python
print(soup.a.previous_sibling)
#遍历后续节点
for sibling in soup.a.next_siblings:
    print(sibling)
#遍历前续节点
for sibling in soup.a.previous_siblings:
    print(sibling)

二、信息标记与提取方法

北京理工大学MOOC爬虫笔记二(第2周)_第6张图片

北京理工大学MOOC爬虫笔记二(第2周)_第7张图片

北京理工大学MOOC爬虫笔记二(第2周)_第8张图片

北京理工大学MOOC爬虫笔记二(第2周)_第9张图片

<>.find_all(name,attrs,recursive,string,**kwargs):返回一个列表类型,存储查找的结果
​    name:对标签名称的检索字符串
​    attrs:对标签属性值的检索字符串,可标注属性检索
​    recursive:是否对子孙全部检索,默认True
​    string:<>…中字符串区域的检索字符串

北京理工大学MOOC爬虫笔记二(第2周)_第10张图片

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')))

三、实例(静态获取)

 

北京理工大学MOOC爬虫笔记二(第2周)_第11张图片

北京理工大学MOOC爬虫笔记二(第2周)_第12张图片

北京理工大学MOOC爬虫笔记二(第2周)_第13张图片

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()

输出结果:

北京理工大学MOOC爬虫笔记二(第2周)_第14张图片

输出不整齐,改进:

北京理工大学MOOC爬虫笔记二(第2周)_第15张图片

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)))

输出结果:

北京理工大学MOOC爬虫笔记二(第2周)_第16张图片

1

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

A

Beautiful Soup

B

re

C

lxml

D

requests

 正确答案 D 

 

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

2

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

from bs4 import 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属于哪个类别?‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

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

TEXT

A

名称

B

字符串

C

属性

D

标签

 正确答案 C 

 

a是标签,href是属性。

5

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

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

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库不能够生成标签树,只能解析、遍历和维护

你可能感兴趣的:(机器学习)