凡是过往,皆为序章

0%

Python爬虫_04(信息提取)

本篇总结爬取时 信息标记提取方法


信息标记的三种形式

  • 标记后的信息可形成信息组织结构,增加了信息维度

  • 标记的结构与信息一样具有重要价值

  • 标记后的信息可用于通信、存储或展示

  • 标记后的信息更利于程序理解和运用

有三种形式,XML,JSON,YAML

1、XML

1
2
3
<name>...</name>
<name />
<!-- -->

2、JSON

1
2
3
4
5
6
"key":"value"
"key":["value1","value2"]
"key":{
"subkey1":"subvalue1",
"subkey2":"subvalue2"
}

注意:JSON无法表示注释内容。

3、YAML

缩进表达所属关系。

1
2
3
4
5
6
7
8
9
key : value
key : # comment
-value1
-value2
key :
subKey : subvalue
text: |
xxx
xxx # | 表达整块数据

信息提取的一般方法

1、完整解析信息的标记形式

需要标记解析器,例如:bs4库的标签树遍历

  • 优点:信息解析准确
  • 缺点:提取过程繁琐,速度慢

2、无视标记形式,直接搜索关键信息

对信息的文本查找函数即可。

  • 优点:提取过程简洁,速度较快
  • 缺点:提取结果准确性与信息内容相关

3、融合方法

结合形式解析与搜索方法,提取关键信息。

需要标记解析器及文本查找函数。

主要学习下面的bs4中的find_all()的查找方法。

基于bs4库的HTML内容查找方法

find_all()

掌握最主要的find_all()方法的使用。

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

该函数的使用说明:

  1. 返回的是列表类型,存储查找的结果

  2. 参数解释:

    1. name: 对标签名称的检索字符串

      这里引用了正则表达式的相关知识,首先import re,引入该模块,调用的方法是re.compile('b'),这表示:模糊查询带有’b’的字符串,例如本题,查找带有字符’b’的所有标签,得到结果为

    2. attrs:对标签属性值的检索字符串,可标注属性检索

      1
      soup.find('h1', attrs = ['class':'ph']) # 查找h1标签,且属性值class为ph

      可见,BeautifulSoup库中的查询是严格的,可以引用re模块来进行模糊查询。

    3. recursive:是否对子孙全部检索,默认True

    4. string:<>...</>中字符串区域的检索字符串

查找方法的等价形式(更简便)

其他查找方法

实例:中国大学的排名爬虫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# CrawUnivRankingA.py
import requests
from bs4 import BeautifulSoup
import bs4


def getHTMLText(url):
try:
r = requests.get(url, timeout=30) # r返回的是一个Response对象
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text # 返回的r中的内容,即html代码的字符串形式
except:
print('连接失败')
return ""


def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:

# soup.find('tbody')返回的是bs4.element.Tag类型
# soup.find('tbody').children返回的是list_iterator类型

if isinstance(tr, bs4.element.Tag): # import bs4 库,使用标签类型
tds = tr('td') # 简写形式,等价于 tr.find_all('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])


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


def main():
uinfo = []
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs


main()
~感谢你请我吃糖果~
-------------本文结束,感谢您的阅读,欢迎评论留言!-------------