Python3爬虫实现中遇到的坑
1)Python3爬虫_RE正则表达式
参考链接:
简单的例子:
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="moreurl(this,{i:'1'})"
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)
