python爬虫中的三种常见解析网页数据的方式

今天对解析网页数据最为常见三种方式进行介绍:分别是Beautiful、正则表达式和xpath。其中xpath最为常用,也最为方便


1 BeautifulSoup

python爬虫中的三种常见解析网页数据的方式

基本知识点:

bs4进行数据解析

-数据解析的原理:

1.标签定位

2.提取标签,标签属性中存储的数据值

-bs4数据解析的原理:

1.实例化一个BeautifulSoup对象,并将页面源码数据加载在该对象中

2.通过调用BeautifulSoup对象中相关属性或者方法进行标签定位和数据提取

-环境安装:

pip install bs4

- 如何实例化BeautifulSoup对象:

- from bs4 import BeautifulSoup

- 对象的实例化:

- 1. 将本地的html文档中的数据加载到该对象中

- 2. 将互联网获取的页面源码加载到该对象中

- 提供的用于数据解析的方法与属性:

- soup.tagName:返回的是文档中第一次出现的tagName对应的标签(tagName为网页中的标签名)

- soup.find('tagName') 返回的也是文档中第一次出现的tagName对应的标签

注:find('tagName')中可以包含多个tagName参数,使得能被准确定位到

- soup.find_all('tagName') 返回的是文档中所有tagName部分(注:中间同样可以包含多个tagName)

- soup.select('某种选择器(id,class,标签...选择器)'),返回的是一个列表

-层级选择器:

> 表示的是一个层级

空格表示的是多个层级

- 获取标签之间的文本数据:

-soup.a.text/string/get_text()

-text/get_text() 可以获取一个标签中所有的文本内容

-string 只可以获得该标签下直系的文本内容

- 获取标签中的属性值:

-soup.a['href']

爬取任务:诗词名句网中的《三国演义》全文

网页显示如下:

python爬虫中的三种常见解析网页数据的方式

代码示例:

<code>from bs4 import BeautifulSoup
import requests
if __name__ == '__main__':
   # 解析网页所有内容
    url = "http://www.shicimingju.com/book/sanguoyanyi.html"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/75.0.3770.100 Safari/537.36 '
    }
    page_text = requests.get(url=url,headers=headers).text
   # 解析网页上需要的东西(即章节详情页链接和章节标题)
    soup = BeautifulSoup(page_text,'lxml')
    li_list = soup.select('.book-mulu > ul > li')
    fp = open('./三国演义.txt', 'w', encoding='utf-8')
    for li in li_list:
        # mile = []
        title = li.a.string
        href = li.a['href']
        page_text2 = requests.get(url="http://www.shicimingju.com"+href, headers=headers).text
        # print(page_text2)
        soup2 = BeautifulSoup(page_text2, 'lxml')
        p_list = soup2.find('div',class_="chapter_content")
        content = p_list.text
        #print(content)
        fp.write(title+":"+content+'\n')
        print(title,"爬取成功")/<code>

结果显示:

python爬虫中的三种常见解析网页数据的方式


2 正则表达式

python爬虫中的三种常见解析网页数据的方式

基本知识点


  • 字符
    • [ab5@]
      匹配"a"或"b"或"5"或"@"
    • [^abc]
      匹配a、b、c之外的任意字符
    • [f-k]
      匹配“f"到"k"之间的字符
    • [^A-F0-3]
      匹配“A"-"F","0"-"3"之外的任意一个字符
    • \d
      任意一个数字,0~9
    • \w
      任意一个字母、数字、汉字或下划线,A~Z、a~z、0~9、_和任意一个汉字
    • \s
      任意空白符,包括空格、制表符、换行符
    • .
      小数点可以匹配任意一个字符,换行除外(如果要匹配包括"\n"在内的所有字符,一般用[\s\S])
    • 普通字符:字母、数字、汉字、下划线,匹配与之相同的一个字符
    • 简单转义字符:\n(换行),\t(制表),\\(\本身)和 \^...(\^等有特殊作用的符号如要匹配自己的话要用转义)
    • 标准字符集合
      注意区分大小写,大写是相反的意思,匹配相反是不匹配
    • 自定义字符集合
      [ ]方括号匹配方式,能够匹配方括号中的任意一个字符,^表示取反
  • 量词(Quantifier)
    修饰前面的一个表达式,如果要修饰多个表达式,就用( )把表达式包起来
    • 贪婪模式 (默认)
      匹配符合的最长的字符串
    • 非贪婪模式 (在量词后面加 ? 例:{m,n}? )
      匹配符合的最短的字符串
    • {n}
      表达式重复n次
    • {m,n}
      表达式至少重复m次,最多重复n次
    • {m,}
      表达式至少重复m次
    • ?匹配表达式0或1次,相当于{0,1}
    • +表达式至少出现一次,相当于{1,}
    • *表达式不出现或出现任意次,相当于{0,}
python爬虫中的三种常见解析网页数据的方式

图源:百度

爬取任务:糗图百科中的“热图”

网页显示如下:

python爬虫中的三种常见解析网页数据的方式

代码示例:

<code>import requests
import re
import os
if __name__ == '__main__':
    # 创建文件夹,用于存放所有图片
    if not os.path.exists('./qiutu'):
        os.mkdir('./qiutu')
    baseurl = "https://www.qiushibaike.com/imgrank/page/"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/75.0.3770.100 Safari/537.36 '
    }
    want_img = int(input("你想获得几页图片:"))
    if 13>= want_img > 0:
        for i in range(1,want_img+1):
            url = baseurl+str(i)
            # 获取单张网页
            response = requests.get(url=url,headers=headers)
            page_text = response.text
​
            # 定位解析专门的链接位置
            findimg = re.compile(r'', re.S)
            img = re.findall(findimg,page_text)  # 注意findall 的前面为re正则,后面为范围
            for j in img:
                scr="https:"+j  #真正的图片链接
                img_data = requests.get(url=scr,headers=headers).content  # 生成图片
                # 生成图片名称
                img_name = scr.split('/')[-1]  # 以图片链接最后的部分作为名字
                # 图片存储的路径
                img_path = './qiutu/'+img_name
                with open(img_path,'wb')  as fp:
                    fp.write(img_data)
                    print(img_name,"下载成功")
        print("一共有%d张"%(len(img)*want_img))
    else:
        print('对不起,铁汁,没这么多页图') 

.*?', re.S) img = re.findall(findimg,page_text) # 注意findall 的前面为re正则,后面为范围 for j in img: scr="https:"+j #真正的图片链接 img_data = requests.get(url=scr,headers=headers).content # 生成图片 # 生成图片名称 img_name = scr.split('/')[-1] # 以图片链接最后的部分作为名字 # 图片存储的路径 img_path = './qiutu/'+img_name with open(img_path,'wb') as fp: fp.write(img_data) print(img_name,"下载成功") print("一共有%d张"%(len(img)*want_img)) else: print('对不起,铁汁,没这么多页图')

结果显示:

python爬虫中的三种常见解析网页数据的方式


3 xpath

python爬虫中的三种常见解析网页数据的方式

基本知识点:

xpath解析:最常用也是最便捷高效的一种解析方式,具有通用性。

-xpath解析原理:

-1.实例化一个etree的对象,且将需要被解析的页面源码数据加载到该对象中

-2.调用etree对象中的xpath方法,结合着xpath表达式实现标签的定位以及内容的捕获。

- 环境的安装:

- pip install lxml

- 如何实例化一个etree对象

-1.将本地的html文档中的源码数据加载到该对象中

etree.parse(filePath)

-2.可以将从互联网上获取的源码数据加载到该对象中

etree.HTML('page_text')

- xpath('xpath表达式')

-xpath表达式

- .: 选取当前节点

- /:表示的是一个层级,从根节点开始定位

- //:表示的是多个层级。可以表示从任意位置开始定位

- 属性定位://tag[@属性='']

- 索引定位://tag[@属性='']/p[3] 索引是从1开始的

- 取文本:

- /text() 获取的是标签中直系的文本内容

- //text() 获取的是标签中非直系的文本内容(标签中所有的文本内容)

- 取属性:

- /@attrName ==>img/src



xpath方式爬取将在接下来的爬取案例中呈现



- END -

python爬虫中的三种常见解析网页数据的方式


python爬虫中的三种常见解析网页数据的方式

读书、观影

分享生活的碎片


有理想的人不会伤心

收藏

举报

李的读书观影笔记Loading.../<code>


分享到:


相關文章: