zoukankan      html  css  js  c++  java
  • 跟我学爬虫-2-使用正则表达式解析文本

      上节简单演示了如何获取一个网页的源代码,本节继续,稍微提升一下我们的水平,网页的源代码中通常包含了大量无用的东西,如果你了解html相关知识的话,就会知道网页源代码中还有大量的标签、css代码、js代码,而这些对我们来说,一般都是不需要的,因此,当我们把网页源代码拿到手之后,还需要对它进行一定的处理,从中提取出我们需要的信息。提取的方法有很多,而今天说的方法是利用正则表达式来提取信息,关于正则表达式,详细用法可参见Python正则表达式指南。

    正则表达式是对字符串进行操作的一种逻辑公式,利用事先定义好的一些特定字符、以及这些特定字符的组合,组成一个"规则字符串",这个规则字符串可以用来实现对待操作字符串的定位,选取等操作。

    在python中使用正则表达式需要用到python的标准库中一个模块re

    >>> import re
    

     简单列一些下面会用到的正则表达式的特殊字符

    • []    字符集,中括号内可以包含任意数量的字符串,然后这个整体可以匹配其中任意一个字符,例如[abc]可以匹配a,b,c中任意一个字符一次
    • [0-9]  匹配一个0-9的数字,0-9是0123456789的简写, 正则表达式支持这样的写法
    • +  匹配前一个字符1到多次
    • .     匹配任意字符,除了换行
    • ()    括号代表分组,可以将正则表达式分为几个小部分
    •      转义,使后一个字符改变原来的意思,主要用来使特殊字符匹配其自身

    不多说,先上代码

    >>> import requests
    >>> url = 'http://httpbin.org/ip'
    >>> response = requests.get(url)
    >>> print response.content
    {
      "origin": "123.114.37.67"
    }
    
    >>> 
    

     上面的代码和昨天差不多,不过打印出了下载到网页的源代码,可以看到,源代码中有一个ip地址,下面我们尝试使用正则获取到这个ip地址

    首先分析一下ip地址的格式,1-3个数字然后是.然后是1-3个数字,这样的重复,那么可以这么写

    [0-9]+.[0-9]+.[0-9]+.[0-9]+

    分析一下:

    [0-9]代表匹配任意一个数字, +代表前面字符可以重复1到多次,因此[0-9]+可以匹配1到多个数字,当然也能匹配1-3个数字

    代表转移, .代表匹配任意字符, .代表去除.的特殊含义,使得.仅能匹配其自身

    >>> content = response.content
    >>> match_obj = re.search("[0-9]+.[0-9]+.[0-9]+.[0-9]+", content)
    >>> match_obj
    <_sre.SRE_Match object at 0x0000000002E37370>
    >>> dir(match_obj)
    ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string']
    >>> match_obj.group()
    '123.114.37.67'
    

     上面的代码中使用了re.search方法将正则表达式作用于获取的网页源代码上,然后再从返回值的group方法中获取正则表达式匹配到的文本

    简单介绍一下re.search方法

    search(pattern, string, flags=0)
        Scan through string looking for a match to the pattern, returning
        a match object, or None if no match was found.
    

     re.search方法接受三个参数,第三个先不说,pattern即为一个正则表达式, string即待操作字符串,然后返回值为一个match object,这个对象的方法在上面的代码中我们也可以看到,可以利用group方法获取匹配到的内容

    好了,本节就到这里,举的例子很简单,不过你可以找一些复杂的网页练练手,熟悉一下正则表达式的用法,以后肯定还会有很多地方会用到正则表达式的

  • 相关阅读:
    Android 应用程序集成FaceBook 登录及二次封装
    Android MVP 设计模式
    java 接口的作用和好处
    Android版本和API Level对应关系
    Android 开源库和项目 2
    高效开发iOS系列 -- 那些不为人知的KVC
    HDU 1019 Least Common Multiple 数学题解
    程序猿喜欢如何的职位描写叙述?
    从零開始搭建微信硬件开发环境全过程——1小时掌握微信硬件开发流程
    Spring ORM数据訪问——Hibernate
  • 原文地址:https://www.cnblogs.com/dyfblog/p/5773258.html
Copyright © 2011-2022 走看看