版权声明: https://blog.csdn.net/Wang_Jiankun/article/details/83754442
Python 网络爬虫笔记4 – 信息标记与提取
Python 网络爬虫系列笔记是笔者在学习嵩天老师的《Python网络爬虫与信息提取》课程及笔者实践网络爬虫的笔记。
课程链接:Python网络爬虫与信息提取
参考文档:
Requests 官方文档(英文)
Requests 官方文档(中文)
Beautiful Soup 官方文档
re 官方文档
Scrapy 官方文档(英文)
Scrapy 官方文档(中文)
一、信息标记
1、XML:标签
- 标签格式:< name> … < /name>
- 空标签:< name />
- 注释:<!‐‐ ‐‐>
<person>
<firstName>Tian</firstName>
<lastName>Song</lastName>
<address>
<streetAddr>中关村南大街5号</streetAddr>
<city>北京市</city>
<zipcode>100081</zipcode>
</address>
<prof>Computer System</prof><prof>Security</prof>
</person>
2、JSON:有类型的键值对key:value
- 键值对单个值:“key” : “value”
- 键值对多个值:“key” : [“value1”, “value2”]
- 嵌套键值对:“key” : {“subkey” : “subvalue”}
{
“firstName” : “Tian” ,
“lastName” : “Song” ,
“address” : {
“streetAddr” : “中关村南大街5号” ,
“city” : “北京市” ,
“zipcode” : “100081”
} ,
“prof” : [ “Computer System” , “Security” ]
}
3、YAML:无类型键值对key:value
- 键值对单个值:key : value
- 键值对多个值:
key : #Comment
‐value1
‐value2 - 嵌套键值对:
key :
subkey : subvalue
firstName : Tian
lastName : Song
address :
streetAddr : 中关村南大街5号
city : 北京市
zipcode : 100081
prof :
‐Computer System
‐Security
二、信息提取
1、信息提取一般方法
形式解析: 完整解析信息的标记形式,再提取关键信息
优点:信息解析准确
缺点:提取过程繁琐,速度慢
搜索: 无视标记形式,直接搜索关键信息
优点:提取过程简洁,速度较快
缺点:提取结果准确性与信息内容相关
融合方法: 结合形式解析与搜索方法,提取关键信息
2、基础查找方法:find_all
函数原型:
find_all(name, attrs, recursive, string, **kwargs)
参数:
- name:要检索标签的名称字符串
- attrs:要检索标签属性值的字符串,可标注属性检索
- recursive:是否对子孙全部检索,默认True
- string:<>…</>中字符串区域的检索字符串
- **kwargs:可选参数
返回: 检索结果的列表
实例:
import requests
from bs4 import BeautifulSoup
def html_search():
"""
检索 HTML 内容,提取信息
:return:
"""
html = requests.get('https://python123.io/ws/demo.html')
soup = BeautifulSoup(html.text, 'html.parser')
# 检索标签
print(soup.find_all('a'))
print(soup.find_all(['a', 'b']))
# 检索标签属性
print(soup.find_all('p', 'course'))
print(soup.find_all(id='link1'))
# 检索字符串
print(soup.find_all(string='python'))
if __name__ == '__main__':
print('running bs:')
html_search()
简写:
- < tag>(…) 等价于 < tag>.find_all(…)
- soup(…) 等价于 soup.find_all(…)
3、其它查找方法
方法 | 说明 |
---|---|
<>.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()参数 |