zoukankan      html  css  js  c++  java
  • python爬虫小结1

    先看正则化,正则化就是描述命令和字符切分、查找、筛选等功能的方便方式。

    http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html

    一个游戏:https://alf.nu/RegexGolf

    先谈谈有何用?初步理解:

    各种网页、latex等杂乱的文档,如何整理有用的东西呢?比如很乱的一个文档中,定位user_id,然后提取相关的信息。设想没有这个“工具”,我们会写个函数,依次的滑动指针做匹配,也稍微有些烦人啊!更加复杂地,要是匹配一个:数字+任意3字母+某个固定字母+可重复2~4次的小单元字母,怎么做呢?直接用自己写的字符串处理函数,想想就心理发麻,四肢无力。好吧,爬虫就是要做这么枯燥的字符串处理,怎么办呢?挨个挨个保存网页图片?终究不是好办法,以后要是还要做数据集可不得了,想想还是学学爬虫,做一劳永逸的事。

    1.简单模式:做匹配

    在linux中,也用过*做拷贝的事,蛮方便的,哈哈。好!我们也试试怎么表达上面深蓝色的任务。首先看看这些关键的特殊地字符:

    .^$*+?{[]|()

    (1)    . 表示任何东西,像linux里面的*

    (2)  ^  求“非”该字符串  或者  匹配字符串的开头

    (3)  $ 匹配字符串的末尾

    (4) * 重复0次以上

    (5) +重复1次以上

    (6) ? 好像是选择

    (7) {m,n} 重复m到n次

    (8) []某个字符的范围,可列举,也可以指明区间,如[abc],或[a-c]

    (9) () 是分组,是希望其他的符号对整块起作用。(ab)*和ab*区别在于abab...,和abbb...

    (10) | 是或

    (11) 转义

    (12) d 任何十进制数,相当于[0-9]

    (13) D 任何非数字字符,相当于[^0-9]

    (14) s 任何空白字符,相当于[ fv]

    (15)S 任何非空白字符,相当于[^ fv]

    (16)w 任何字母数字字符,相当于[a-zA-Z0-9_]

    (17)W 反之

     (18) A 匹配句尾句首,无论是不是MULTILINE形式

    (19)  匹配句尾

    (20)  单词边界。 只用以匹配单词的词首和词尾。单词被定义为一个字母数字序列,因此就是用空白符或者非字母数字符来标示。

    (21)B 则相反

    2、使用正则表达式

    实际中怎么用上面的东西呢?总得有个环境或者链接的“东西”告诉电脑,我表达的正则化的东西,不是一对乱数字啊。那直接写在python里面?str=xxx,还不行啊,只是个字符串,还没搞到正则化的“内核”工具。好吧,答案是re 模块(包)来指明这一切的一切(小学喜欢写作文这么写,e.g., 他把自己一切的一切献给了祖国)。经过REs编译成为了“RegexObject”对象。对象可以有很多方法手段的哦。举个栗子:

    import re

    p = re.compile('ab*')    #编译

    print p                        #看看是什么鬼

    <re.RegexObject instance at 80b4150>

     再这里,先打个岔,转义符号的麻烦,我们知道要搞个section的表达式(latex中最喜欢用section来搞事情了。那么分析latex文档的小伙伴就要注意了),每当把“命令”当成字符串的时候就要加一个转义。第一次写成\section作为字符串,以让第二个保持。那如果把“命令+“\section”当成字符串的时候,要削减两次,这时应该改成“命令+“\\section”,相当让人困惑。怎么办,早就有人注意到这个问题了。这样办:

     

    ok,我们最后看看怎么执行匹配。这里,我们只看看最关键的几个方法:

    (1) match()决定是否在字符串刚开始的位置匹配

    (2) search()扫描字符串,找到这个RE匹配的位置

    (3) findall() 找到RE匹配的所有子串,并把它们作为一个列表返回

    (4) finditer() 找到RE匹配的所有子串,并把它们作为一个迭代器返回

    match,search返回NONE如果没有匹配的话,反之返回Matchobject实例。查看实例相关,可以用这几个方法:

    举个栗子:

    栗子2:

    栗子3:

    栗子4:

    有时候,不一定要先产生RegexObject对象,re模块提供顶级函数用match(), search(), sub()等等,可以将两步合成一步。这是RE字符串作为第一个参数,第二个则是相应RegexObject的方法参数相同。返回则要么是None要么就是一个MatchObject的实例。

    编译标志:两种形式,一种是缩写,一种是字母

    对于4,参考Page 13.

    3. 更多模块功能

    的栗子:

    进一步地,看看r起的作用:

    括号分组的栗子:

    逆向引用没看到:

    组:

    命令组:?:

    无捕捉组:?P<name>

    界定符:

    前向肯定界定符:(?=)

    前向否定界定符:(?!)

    4. 修改字符串

    这里只是简单谈谈,不展开,因为现在还没用得上。(爬虫只要查找就行了吧?)

    5. 常见问题

    1)优化表达式

    2)match()和search()

    3)贪婪vs不贪婪:

  • 相关阅读:
    团队作业第四次—项目系统设计与数据库设计
    团队Github实战训练
    第三次团队作业(需求分析)
    团队作业——UML设计
    项目介绍
    Happy Tree Friends——团队展示
    Alpha冲刺 (1/9)
    团队作业第四次—项目系统设计与数据库设计
    团队Github实战训练
    团队作业——需求分析
  • 原文地址:https://www.cnblogs.com/Wanggcong/p/7429836.html
Copyright © 2011-2022 走看看