python爬虫学习22

python爬虫学习22

三、正则表达式

3.search方法

之前我们学习了正则表达式中的match方法,请大家回想一下match方法的前提,没错match方法是从字符串开头开始匹配,那么一旦开头不匹配,意味着整个匹配就废了:

# match 的局限性
import re

content = 'Extra strings Hello 1234567 World_this is a Regex Demo Extra    stings'
result = re.match('Hello.*?(\d+).*?Demo', content)
print(result)

运行结果:表达式没有问题,但是却没有匹配到任何内容

在这里插入图片描述

由此可以得出,match在使用时我们必须知道待匹配字符串的开头部分,此方法才可以使用。所以在实际应用中它更适合检测某个字符串是否符合某个正则表达式规则。

这时候,要想要解决问题就要靠 search 方法了,它在匹配时会先扫描整个字符串然后匹配字符串中第一个匹配成功的结果,如果没有扫描到符合第一个正则表达式的结果就会返回None。此时我们写出的正则表达式就可以是字符串的某一部分:

# search 简单应用
import re

content = 'Extra strings Hello 1234567 World_this is a Regex Demo Extra    stings'
result = re.search('Hello.*?(\d+).*?Demo', content)
print(result.group(1))

运行结果:

在这里插入图片描述

那么我们用search方法来尝试一下:现在有一段html

		<div class="nav">

			<ul>

				<li><a href="https://www.qbiqu.com/">首页</a></li>

                <li><a href="/modules/article/bookcase.php">我的书架</a></li>

				<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>

				<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>

				<li><a href="/dushixiaoshuo/">都市小说</a></li>

				<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>

				<li><a href="/wangyouxiaoshuo/">网游小说</a></li>

				<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>

				<li><a href="/paihangbang/">排行榜单</a></li>

				<li><a href="/wanben/1_1">完本小说</a></li>

				<li><a href="/xiaoshuodaquan/">全部小说</a></li>

                <li><script type="text/javascript">yuedu();</script></li>

			</ul>

		</div>

        <div id="banner" style="display:none"></div>

		<div class="dahengfu"><script type="text/javascript">list1();</script></div>

可以观察到ul节点中有很多li节点,这些li节点中有的包含a节点,有的不包含a节点。a节点又有其相应的属性。现在我们想要用search方法成功匹配到其中的小说类别:

在经过细致的观察,我们发现小说的类别前面都会出现相同的字符串 ‘xiaoshuo/"’,所以我们在写正则表达式时就要记得在匹配时吧他写进去:

import re

html = """
<div class="nav">
			<ul>
				<li><a href="https://www.qbiqu.com/">首页</a></li>
                <li><a href="/modules/article/bookcase.php">我的书架</a></li>
				<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>
				<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>
				<li><a href="/dushixiaoshuo/">都市小说</a></li>
				<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>
				<li><a href="/wangyouxiaoshuo/">网游小说</a></li>
				<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>
				<li><a href="/paihangbang/">排行榜单</a></li>
				<li><a href="/wanben/1_1">完本小说</a></li>
				<li><a href="/xiaoshuodaquan/">全部小说</a></li>
                <li><script type="text/javascript">yuedu();</script></li>
			</ul>
		</div>
        <div id="banner" style="display:none"></div>
		<div class="dahengfu"><script type="text/javascript">list1();</script></div>
		"""
# 由于html中有很多换行所以别忘了使用修饰符
result = re.search('href.*?xiaoshuo/">(.*?)<', html, re.S)
print(result.group(1))

运行结果:

在这里插入图片描述

这样就获取成功了

如果不写入之前的字符串而是

'herf.*?>(.*?)<'

会出现什么结果呢?大家不要往下看,先仔细的想一想

。。。

。。。

import re

html = """
<div class="nav">
			<ul>
				<li><a href="https://www.qbiqu.com/">首页</a></li>
                <li><a href="/modules/article/bookcase.php">我的书架</a></li>
				<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>
				<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>
				<li><a href="/dushixiaoshuo/">都市小说</a></li>
				<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>
				<li><a href="/wangyouxiaoshuo/">网游小说</a></li>
				<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>
				<li><a href="/paihangbang/">排行榜单</a></li>
				<li><a href="/wanben/1_1">完本小说</a></li>
				<li><a href="/xiaoshuodaquan/">全部小说</a></li>
                <li><script type="text/javascript">yuedu();</script></li>
			</ul>
		</div>
        <div id="banner" style="display:none"></div>
		<div class="dahengfu"><script type="text/javascript">list1();</script></div>
		"""

result = re.search('href.*?>(.*?)<', html, re.S)
print(result.group(1))

运行结果:

没有写入‘xiaoshuo/"’时,search就会寻找第一个符合条件的字符,它找啊找啊就找到了>首页<这里

在这里插入图片描述

运用我们所学的知识还是很容易得出答案的。

今天我们学习了正则表达式中的search方法,但是这种方法一次只能匹配第一种符合情况的结果,如果我们想要获取全部的结果就我能为力了,那么如何解决呢?

今日结束,下篇继续

猜你喜欢

转载自blog.csdn.net/szshiquan/article/details/123781543