信息组织与提取
一、信息标记
HTML:
通过预定义的<>..>标签形式来组织不同类型的信息
信息标记的种类有三种 Xml,JSON,YAML
Xml: 扩展标记语言,与html格式很像
通过
标签形式来构造所有的信息,如果标签中有内容时我们用一对标签来表达: ...
如果标签中没有内容时,我们用一对尖括号来表达
同时可以增加注释:
JSON:
采用
有类型键值的方式:“key”:"value"
如果对应的值的部分有多个,则采用方括号: "key": ["value1',"value2'] 并且中间用逗号隔开
同时键值对可以进行嵌套,此时采用大括号: “key":{"subkey":"subvalue"}
YAML:
无类型键值对,采用缩进的方式表示所属关系,这一点和python很像
|表示整块内容,#表示注释的内容
key:value
key:
-value1
-value2 #横线表示并列
key:
subkey:subvalue
二、信息提取的一般方法
信息提取是指从信息标记的文本中提取所需要的内容
有三种:
1.根据标记形式,利用bs4库遍历标签树的方法先解析出标记形式再提取关键字
2.不关注标记形式,采用文本查找函数,直接搜索关键字
3采用融合的方式,结合形式解析和搜索方法提取关键信息
xml JSON YMAL 搜索
需要标记解释器和文本查找函数
实例:提取HTML中所有url链接
思路:
import requests
r=requests.get("http://pyhton123.io/ws/demo.html')
demo=r.text
from bs4 import BeautifulSoup
soup=BeautifulSoup(demo,"html.parser") #soup里面包含了html页面的全部信息
for link in soup.find_all('a'): #查找所有的
标签
print(link.get('href'))
三、基于bs4库的HTML内容的查找方法
查找所有的a标签:
soup.find_all('a')
查找a,b标签:
soup.fidn_all(['a','b']) #以列表的形式
下面我们检索a标签:
print(soup.find_all('a')) #就会返回这个demo文件( 是用变量soup代替)里面所有的a标签的内容
如果是a标签和b标签作为一个列表的形式:
print(soup.find_all(['a','b']))
如果查找的关键字我们给的是True,则会返回所有的标签,我们用for循环来实现一下:
for tag in soup.find_all(True):
print(tag.name)
下面我在cmd中运行一下得到的结果是:
soup.find_all('') 可以在我们的soup变量中查找我们的信息
<>.find_all(name,attrs,recursive,string,**kwargs) 返回一个列表的类型返回我们查找的结果
find_all()第一个属性name 是对标签名称的检索字符串
如果我们只显示以b开头的标签 包括和标签,那么此时就得使用一个新的库叫做正则表达式库
首先导入正则表达式库 impirt re
for tag in soup.find_all(re.compile('b')): #就会返回所有以b开头的内容
print(tag.name) #然后我们打印出tag标签的名称
find_all的第二个属性是 attrs是对标签属性值的检索字符串,可以标注属性检索
soup.find_all('p','course') # 这样就会返回包含course属性值的所有p标签:
我们也可以对属性进行约束 进行检索:
soup.find_all(id='link1')
当我们查找属性值为link的标签时 发现返回的是一个空的集合 也就表明在我们的demo文件中其实是不存在名称为link的标签的:
soup.find_all(id='link')
我们可以借助正则表达式输出以link为id 的所有标签:
import re #导入正则表达式库
print(soup.find_all(id=re,compile('link')))
****************************************现在吃饭回来了***********************************************
来回忆一下刚才学的:
import requests
r=requests.get("http://python123.io/ws/demo.html")
demo=r.text
from bs4 import BeautifulSoup
soup=BeautifulSoup(demo,"html.parser")
soup.a
soup.a.name
soup.p
soup.p.parent
soup.a.attrs
type(soup.aattrs)
soup.a.contents
for i in soup.a.children:
print(i)
soup.a.next_sibling
soup.a.previous_sibling
for i in soup.p.next_siblings:
if i is not None:
print(i)
else:
print(i.name)
soup.find_all('a')
soup.find_all('p','course')
for i in soup.find_all(True):
print(i)
import re
soup.find_all(id='link')
soup.find_all(id='link1')
for i in soup.find_all(id=re.compile('link')):
print(i)
正则表达式其实就像我们平时做搜索一样,也是我们搜索的一部分,如果不使用正则表达式我们就需要给出完整准确的信息,有了正则表达式,我们只需要给出其中一部分即可
find_all()的第三个属性是recursive,它是一个布尔类型的,表示是否对子孙全部搜索,默认值是True,
首先我们查找a的所有标签:
soup.a.find_all('a')
然后从soup 这个根节点开始我们令recursive为false 来查找a标签
soup.find_all('a',recursive=False) #注意此处False需要大写
发现返回的是空。这就说明从soup这个根节点开始儿子节点是没有a标签的,a标签存在于后续的子孙节点中
find_all()的第四个参数是string指的是对标签中<>...>中间的字符串域进行检索的字符串参数
soup 其实soup就是一个变量,相当于demo,包含了我们页面的所有信息 (r=requests.get(url),demo=rtext soup=BeautifulSoup(demo,“html.parser”))
接下来我们查找一个字符串,soup.find_all(string='BasicPython')这个时候必须得精确输入才可以查找到相关信息;
当我们使用正则表达式时 就会把html页面中包含python的检索出来;
soup.find_all(string=re.compile('Python'))
因此使用正则表达式 结合find_all()函数可以很方便的检索我们需要的内容