Python3爬虫学习中踩到的坑_RE正则表达式

205 阅读3分钟

Python3爬虫实现中遇到的坑

1)Python3爬虫_RE正则表达式


参考链接:

  1. 维基百科
  2. PYTHON官方文档
  3. 杨老师的BLOG
  4. AstralWind

简单的例子:

import re
#摘取自豆瓣读书TOP250
string = ''' 
<table width="100%">
    <tr class="item">
        <td width="100" valign="top">
            <a class="nbg" href="https://book.douban.com/subject/25862578/" onclick="moreurl(this,{i:'1'})">
                <img src="https://img3.doubanio.com/view/subject/m/public/s207264181.jpg" width="90"/>
            </a>
        </td>
        <td valign="top">
            <div class="pl2">
                <a href="https://book.douban.com/subject/25862578/" onclick=&#34;moreurl(this,{i:&#39;1&#39;})&#34;
                   title="解忧杂货店">
                    解忧杂货店
                </a>
                <br/>
                <span style="font-size:12px;">ナミヤ雑貨店の奇蹟</span>
            </div>
            <p class="pl">[日] 东野圭吾 / 李盈春 / 南海出版公司 / 2014-5 / 39.50元</p>
            <div class="star clearfix">
                <span class="allstar45"></span>
                <span class="rating_nums">8.5</span>
                <span class="pl">(
                    583389人评价
                )</span>
            </div>
            <p class="quote" style="margin: 10px 0; color: #666">
                <span class="inq">一碗精心熬制的东野牌鸡汤,拒绝很难</span>
            </p>
        </td>
    </tr>
</table>'''
pattern = re.compile(r'此处写相应的Re表达式',re.S|re.M)
print(pattern, string)  

获取超链接:

pattern = re.compile(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",re.S|re.M)

结果:

['book.douban.com/subject/258…', 'book.douban.com/subject/258…']


获取类似span这种标签之间内容:

pattern = re.compile(r'<span.*?>(.*?)</span>',re.S|re.M)

结果:

['ナミヤ雑貨店の奇蹟', '', '8.5', '一碗精心熬制的东野牌鸡汤,拒绝很难']

[注意]这里遇到了问题:我们遗漏了一个span标签的内容:

<span class="pl">(
                    583389人评价
                )</span>

原因:在re表达式中:这个‘.’可以匹配除“\r”“\n”之外的任何单个字符,但上述的span标签的内容中出现了换行符\r\n,所以不满足上述的表达式,所以会直接略过这个标签,现修改如下

pattern = re.compile(r'<span class="pl">\(\s+(.*?)\s+\)</span>',re.S|re.M)

结果:

['583389人评价']

只提取数字,可以:

pattern = re.compile(r'<span class="pl">\(\s+(\d*).*\s+\)</span>',re.S|re.M)

结果:

['583389']

有意思的是:在摸索的过程中还出现了一个我不知道怎么解决的问题:

为了解决提取这个span标签,我尝试过这样写:

pattern = re.compile(r'<span.*?>((.|\r|\n)*?)</span>'
,re.S|re.M)

结果:

[('ナミヤ雑貨店の奇蹟', '蹟'), ('', ''), ('8.5', '5'), ('( \n 583389人评价\n )', ')'), ('一碗精心熬制的东野牌鸡汤,拒绝很难', '难')]

出现了我们想要的所有内容,但每一个内容里都出现了一次重复,这是为什么呢?

我暂时还没有找到答案(欢迎留言交流鸭!),个人猜想是:做提取作用和做包含作用的的'()'优先级可能是相同的(编译原理让本渣渣想到这个),所以会同时起作用


还有一些内容呢,就不一一列出了,了解基础的RE语法(.*? 是真TM酸爽),根据网页的结构进行相应的更改就OK啦!(用好F12 和 Ctrl+Shirt+C)

神秘通道:打开爬虫新世界,RE表达式都不用写了

哈哈哈