on、yaml
标记后的信息可形成信息组织结构,增加了信息维度
标记的结构与信息一样具有重要价值
标记后的信息可用于通信、存储或展示
标记后的信息更利于程序理解和运用
文本、声音、图像、视频
XML 最早的通用信息标记语言,可扩展性好,但繁琐 Internet上的信息交互与传递
JSON 信息有类型,适合程序处理(js),较XML简洁 移动应用云端和节点的信息通信,无注释
YAML 信息无类型,文本信息比例最高,可读性好 各类系统的配置文件,有注释易读
信息提取的一般方法
从标记后的信息中提取所关注的内容xml、json、yaml
方法一:完整解析信息的标记形式,再提取关键信息
优点:信息解析准确
缺点:提取过程繁琐,速度慢
方法二:无视标记形式,直接搜索关键信息 对信息的文本查找函数即可
优点:提取过程简洁,速度较快
缺点:提取结果准确性与信息内容相关
融合方法:结合形式解析与搜索方法,提取关键信息
需要标记解析器及文本查找函数
<>.find_all(name, attrs, recursive, string, **kwargs)
返回一个列表类型,存储查找的结果
? name : 对标签名称的检索字符串
? attrs: 对标签属性值的检索字符串,可标注属性检索
? recursive: 是否对子孙全部检索,默认True
? string: <>…</>中字符串区域的检索字符串
<tag>(..) 等价于<tag>.find_all(..)
soup(..) 等价于soup.find_all(..)
扩展方法:
<>.find() 搜索且只返回一个结果,同.find_all()参数
<>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
<>.find_parent() 在先辈节点中返回一个结果,同.find()参数
<>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_next_sibling() 在后续平行节点中返回一个结果,同.find()参数
<>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_previous_sibling() 在前序平行节点中返回一个结果,同.find()参数
3.3 实例:大学排名爬取
#CrawUnivRankingB.py
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.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('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 = 'https://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs
main()
4 网络爬虫之实战
4.1正则表达式
正则表达式语法由字符和操作符构成
常用操作符
. 表示任何单个字符
[ ] 字符集,对单个字符给出取值范围[abc]表示a、b、c,[a‐z]表示a到z单个字符
[^ ] 非字符集,对单个字符给出排除范围[^abc]表示非a或b或c的单个字符
* 前一个字符0次或无限次扩展abc* 表示ab、abc、abcc、abccc等
+ 前一个字符1次或无限次扩展abc+ 表示abc、abcc、abccc等
? 前一个字符0次或1次扩展abc? 表示ab、abc
| 左右表达式任意一个abc|def 表示abc、def
{m} 扩展前一个字符m次ab{2}c表示abbc
{m,n} 扩展前一个字符m至n次(含n) ab{1,2}c表示abc、abbc
^ 匹配字符串开头^abc表示abc且在一个字符串的开头
$ 匹配字符串结尾abc$表示abc且在一个字符串的结尾
( ) 分组标记,内部只能使用| 操作符(abc)表示abc,(abc|def)表示abc、def
\d 数字,等价于[0‐9]
\w 单词字符,等价于[A‐Za‐z0‐9_]
经典正则表达式
^[A‐Za‐z]+$ 由26个字母组成的字符串
^[A‐Za‐z0‐9]+$ 由26个字母和数字组成的字符串
^‐?\d+$ 整数形式的字符串
^[0‐9]*[1‐9][0‐9]*$ 正整数形式的字符串
[1‐9]\d{5} 中国境内邮政编码,6位
[\u4e00‐\u9fa5] 匹配中文字符
\d{3}‐\d{8}|\d{4}‐\d{7} 国内电话号码,010‐68913536
ip地址
精确写法0‐99: [1‐9]?\d
100‐199: 1\d{2}
200‐249: 2[0‐4]\d
250‐255: 25[0‐5]
(([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]).){3}([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5])
raw string类型(原生字符串类型)
re库采用raw string类型表示正则表达式,表示为:r’text’ 例如: r'[1‐9]\d{5}’ r’\d{3}‐\d{8}|\d{4}‐\d{7}’