python crawler apprentissage 23

python crawler apprentissage 23

3. Expressions régulières

4. méthode findall

Auparavant, nous avons appris les fonctions et les lacunes respectives des méthodes de recherche et de correspondance. Dans l'étude d'hier, nous savions qu'après avoir utilisé la méthode de recherche, nous pouvons efficacement éviter le problème selon lequel la méthode de correspondance doit correspondre à la chaîne depuis le début, mais la recherche lui-même a également de grands défauts, à savoir Seul le premier résultat correspondant sera trouvé.

À ce stade, si nous voulons faire correspondre tous les résultats possibles, nous devons utiliser findall (littéralement, nous pouvons intuitivement savoir ce que fait cette méthode)

Prenez le texte html d'hier et faites toujours correspondre toutes les nouvelles catégories qu'il contient

<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>

Appliquez la méthode findall :

# fidall 方法
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.findall('href.*?xiaoshuo/">(.*?)<', html, re.S)
print(type(result))	# 由结果可知,findall方法最终会返回一个列表
i = 0
for item in result:
    print(i, ':', item)
    i += 1

résultat de l'opération :

insérez la description de l'image ici

Si l'expression régulière correspond à plusieurs cibles :

# fidall 方法
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.findall('href.*?/(.*?)/">(.*?)<', html, re.S)
print(type(result))
i = 0
for item in result:
    print(i, ':', item)
    i += 1

Résultats en cours d'exécution : chaque résultat correspondant formera un tuple, puis formera une liste avec d'autres résultats

insérez la description de l'image ici

5. sous

Dans l'opération de requête de base, si nous voulons modifier la chaîne, nous devons utiliser la sous-méthode

import re

content = 'as5af6fa5fa6fsfa'
# 假如我们想要把其中的数字都去掉,在replace的方法外我们还可以通过sub方法实现
result = re.sub('\d+', '', content)
print(result)

résultat de l'opération :

insérez la description de l'image ici

Pour en revenir au texte html précédent, si nous voulons y mettre tout le chinois, il peut être très gênant d'écrire un regular (bien sûr c'est très simple ici), à ce moment nous pouvons utiliser sub et findall ensemble :

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.sub('<a.*?>', '', html, re.S)
print(result)
result1 = re.findall('<li>(.*?)</a>', result, re.S)
for item in result1:
    print(item)

Résultat après utilisation de sub :

insérez la description de l'image ici

Sur cette base, le résultat de notre correspondance regex :

insérez la description de l'image ici

6. compiler

La méthode compile peut compiler des chaînes régulières en objets d'expression régulière :

import re

text1 = '2020-03-28 20:00'
# 假设现在有多段不同的html文本,我们想要匹配其中的某些相同的元素如中文歌名等,这时对于每段html我们都要传入相同的表达式(假设表达式相同),与re.S等修饰器内容
# 这样就不如先把它们集成成一个对象,方便以后代码的复用
pattern = re.compile('\d{2}:\d{2}', re.S)
# 把它编译成一个对象以后就可以实现代码的复用,就不用每次遇到都要重新输入'\d{2}:\d{2}'
result = re.sub(pattern, '', text1)
print(result)

résultat de l'opération :

insérez la description de l'image ici

Jusqu'à présent, nous avons fini d'apprendre le contenu pertinent des expressions régulières. Pensez-vous que notre système de connaissances s'est en grande partie enrichi ?

Aujourd'hui se termine, à suivre...

Je suppose que tu aimes

Origine blog.csdn.net/szshiquan/article/details/123804997
conseillé
Classement