python网络爬虫笔记之信息提取

信息组织与提取

一、信息标记

HTML:
          通过预定义的<>..</>标签形式来组织不同类型的信息

信息标记的种类有三种 Xml,JSON,YAML

Xml: 扩展标记语言,与html格式很像
         通过标签形式来构造所有的信息,如果标签中有内容时我们用一对标签来表达: <name>...</name>
          如果标签中没有内容时,我们用一对尖括号来表达<name/>
         同时可以增加注释:<! --注释-- >

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链接
思路:
1提取所有的<a>标签
2解析<a>标签格式,提取href后边链接内容
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'):    #查找所有的<a>标签
    print(link.get('href'))

python网络爬虫笔记之信息提取

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

查找所有的a标签:
 soup.find_all('a')
查找a,b标签:
soup.fidn_all(['a','b'])   #以列表的形式

下面我们检索a标签:
print(soup.find_all('a'))   #就会返回这个demo文件( 是用变量soup代替)里面所有的a标签的内容
python网络爬虫笔记之信息提取


如果是a标签和b标签作为一个列表的形式:
print(soup.find_all(['a','b']))

python网络爬虫笔记之信息提取



如果查找的关键字我们给的是True,则会返回所有的标签,我们用for循环来实现一下:
for tag in soup.find_all(True):
      print(tag.name)
下面我在cmd中运行一下得到的结果是:
python网络爬虫笔记之信息提取


soup.find_all('')  可以在我们的soup变量中查找我们的信息
<>.find_all(name,attrs,recursive,string,**kwargs)  返回一个列表的类型返回我们查找的结果

find_all()第一个属性name  是对标签名称的检索字符串


如果我们只显示以b开头的标签 包括<b>和<body>标签,那么此时就得使用一个新的库叫做正则表达式库
 首先导入正则表达式库 impirt re
 for tag in soup.find_all(re.compile('b')):    #就会返回所有以b开头的内容
     print(tag.name)         #然后我们打印出tag标签的名称
python网络爬虫笔记之信息提取


find_all的第二个属性是 attrs是对标签属性值的检索字符串,可以标注属性检索

soup.find_all('p','course')   # 这样就会返回包含course属性值的所有p标签:

python网络爬虫笔记之信息提取


我们也可以对属性进行约束 进行检索:
soup.find_all(id='link1')
python网络爬虫笔记之信息提取

当我们查找属性值为link的标签时 发现返回的是一个空的集合 也就表明在我们的demo文件中其实是不存在名称为link的标签的:
soup.find_all(id='link')

我们可以借助正则表达式输出以link为id 的所有标签:
import re      #导入正则表达式库
print(soup.find_all(id=re,compile('link')))

python网络爬虫笔记之信息提取


****************************************现在吃饭回来了***********************************************

来回忆一下刚才学的:

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标签存在于后续的子孙节点中
python网络爬虫笔记之信息提取


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'))
python网络爬虫笔记之信息提取

因此使用正则表达式 结合find_all()函数可以很方便的检索我们需要的内容