Pythonクローラー学習23
3.正規表現
4.findallメソッド
以前は、検索メソッドと一致メソッドのそれぞれの機能と欠点を学びました。昨日の調査では、検索メソッドを使用した後、一致メソッドが最初から文字列と一致する必要があるという問題を効果的に回避できることがわかりましたが、検索それ自体にも大きな欠陥があります。つまり、最初の一致する結果のみが見つかります。
現時点で、考えられるすべての結果を一致させたい場合は、findallを使用する必要があります(文字通り、このメソッドが何をするかを直感的に知ることができます)
昨日の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>
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
演算結果:
正規表現が複数のターゲットに一致する場合:
# 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
実行結果:一致する各結果はタプルを形成し、次に他の結果とのリストを形成します
5.サブ
基本的なクエリ操作で、文字列を変更する場合は、subメソッドを使用する必要があります
import re
content = 'as5af6fa5fa6fsfa'
# 假如我们想要把其中的数字都去掉,在replace的方法外我们还可以通过sub方法实现
result = re.sub('\d+', '', content)
print(result)
演算結果:
前のhtmlテキストに戻って、すべての中国語をその中に入れたい場合、通常の文字を書くのは非常に面倒かもしれません(もちろん、ここでは非常に簡単です)。現時点では、subとfindallを一緒に使用できます。
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)
subを使用した後の結果:
これに基づいて、正規表現の一致の結果は次のとおりです。
6.コンパイルします
compileメソッドは、正規文字列を正規表現オブジェクトにコンパイルできます。
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)
演算結果:
これまでのところ、正規表現の関連内容の学習は終了していますが、知識システムが大幅に充実していると思いますか?
今日は終わり、続く...