4、简单的网络爬虫例子

1、 在百度输入JavaScript,点击搜索,把搜索出来的标题,通过正则表达式找到这些标题。

提取效果图:

具体实现方法:

1、 搜索口,在浏览器的空白地方右键,查看页面源码,并把源码拷贝到RegexBuddy 工具中,注:完整页面源码放在文末

2、 分析规律:(黄色区域是随便找的一个小结构,里面是我们要找的标题百度百科)

<div class="result-op c-container xpath-log"  srcid="1547"  id="1" tpl="bk_polysemy" mu="https://baike.baidu.com/item/javascript/321142" data-op="{'y':'FFC8DDFB'}" data-click="{'p1':'1','rsv_bdr':'0','fm':'albk',rsv_stl:''}">
           
            <h3 class="t c-gap-bottom-small">
                                                                            <a href="http://www.baidu.com/link?url=P7-T8M-HzpOWnRB_abbVi1rj477cfljHUoohYrfQyq1YFgZomb0snU6T4p5dj9VkEOtb1eRT4HnoPfJSj5HLma9s3HWyxMWqtBPZjAVpjDu" target="_blank">
                                        <em>javascript</em>_百度百科
                    </a>

3、以<div开头,找到好多结果,此时正则表达式:<div

4、紧跟着有一个空格(可能有多个空格),此时正则表达式:<div\s+

          

5、紧跟着class=” ,此时正则表达式:<div\s+class="

6、紧跟着result-op,写标贴跟着的是result ,此时正则表达式:

<div\s+class="(result|result-op)

注:括号认为是一个分组,中间 | 表示或 的关系。

结果发现,匹配出来的都是result,而result-op没有匹配出来。这是由于 | 或条件前面写的是result后面写的是result-op,它会先匹配result假如匹配不上的话再匹配result-op,而result-op中有result,所以就先匹配出来result后就不去匹配result-op了

       解决办法一:把result-op写在前面:

       解决办法二:在这个组后多加元素限定,因为这个组后,紧跟着是空格

7、后面紧跟着一个空格或多个 ,此时正则表达式:

<div\s+class="(result|result-op)

8、后面是一大串无规律的字符,一直到这个标题结构内的<a的出现,此时正则表达式:

<div\s+class="(result|result-op)\s+.*?<a

注:.*?<  表示用懒惰匹配,匹配最近的<

       结果发现没匹配上,这是由于中间出现了换行。解决办法,修改参数:

9、紧跟着一大串无规律的字符,一直到这个标题结构内的>的出现,此时正则表达式:

<div\s+class="(result|result-op)\s+.*?<a.*?>

9、紧跟着后面就是我们需要找到的标题(无规律的),再然后就是一个<\a>

       此时正则表达式:

<div\s+class="(result|result-op)\s+.*?<a.*?>.*?</a>

10、这是已经从一个很长的文本字符串中找到了每个标题结构。但是这个结构我们只想要标题,即从>到</a>之间的数据,即>到</a>之间.*?这时,我们可以在需要的这个数据(>到</a>之间.*?)加上分组:

<div\s+class="(result|result-op)\s+.*?<a.*?>(.*?)</a>

匹配出来的结果是一样的:

但是我们可以按组查看的结果:上面的正则表达式已经有了两个组,我们需要的是第二组,所以下面选择第二组就会得出我们想要的标题

(result|result-op)

(.*?)

11、以上最终的正则表达式是:

 <div\s+class="(result|result-op)\s+.*?<a.*?>(.*?)</a>

12、为了方便跟快捷找到结果,可以给分组命名,然后通过这个命名即可找到分组

       如给第二组命名为:标题

       正则表达式应该为:<div\s+class="(result|result-op)\s+.*?<a.*?>(?<标题>.*?)</a>

       然后结果就可以通过“标题”这样的命名获得

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值