信息提取:从标记后的信息中提取所关注的内容
方法一:完整解析信息的标记形式,再提取关键信息
XML、JSON、TAML
需要标记解析器,例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢
方法二:无标记形式,直接搜索关键信息
搜索
对信息的文本查找函数即可
优点:提取过程简洁,速度较快
缺点:提取结果准确性与信息内容相关
融合方法:结合形式解析与搜索方法,提取关键信息
需要标记解析器及文本查找函数
实例
#提取HTML中所有url连接
#思路1:搜索到所有<a>标签
# 2:解析<a>标签,提取href后的链接内容
>>> from bs4 import BeautifulSoup
>>> import requests
>>> r = requests.get("https://python123.io/ws/demo.html")
>>> r.text
>>> demo = r.text
>>> soup = BeautifulSoup(demo,'html.parser')
>>> for link in soup.find_all('a'):
print(link.get('href'))
在这里插入代码片
结果:
http://www.icourse163.org/course/BIT-268001
http://www.icourse163.org/course/BIT-1001870001
<>.find_all(name,attrs,recursive,string,**kwargs)
返回一个列表类型,存储查找的结果|
名称 | 说明 |
---|---|
name | 对标签名称的检索字符串 |
attrs | 对标签属性值的检索字符串,可标注属性检索 |
recursive | 是否对子孙全部检索,默认True |
string | <>…</>中字符串区域的检索字符串 |
#name:对标签名称的检索字符串
>>> soup.find_all('a') #查找<a>标签
>>>soup.find_all(['a','b']) #查找<a>和<b>标签>>>
>>>for tag in soup.find_all(True): #遍历soup中所用标签并打印出标签名字
print(tag.name)
>>> import re #引入正则表达式库
>>> for tag in soup.find_all(re.compile('b')):#查找soup中以‘b’开头的标签并打出名字
print(tag.name)
#attrs:对标签属性值的检索字符串,可标注属性检索
>>>soup.find_all('p','course') #查找包含‘course’属性值的<p>
>>> soup.find_all(id='link') #需精确查找
[]
>>> soup.find_all(id='link1')
[<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>]
>>> soup.find_all(id=re.compile('link')) #查找以‘link’开头的信息
#recursive:是否对子孙全部检索,默认True
>>> soup.find_all('a') #搜索soup节点下的名为<a>子孙节点
[<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
>>> soup.find_all('a',recursive = False ) #搜索soup节点下的名为<a>儿子节点
[] #为空,<a>不是soup节点的儿子节点
#string <>...</>中字符串区域的检索字符串
>>> soup.find_all(string = 'Basic Python')
['Basic Python']
>>> soup.find_all(string = re.compile('python')) #检索带有‘python’的字符串
['This is a python demo page', 'The demo python introduces several python courses.']
在这里插入代码片