gpt4 book ai didi

python - 将 BeautifulSoup 4's ` find_all` 与正则表达式一起使用时,如何访问正则表达式匹配捕获组?

转载 作者:行者123 更新时间:2023-11-28 18:35:11 25 4
gpt4 key购买 nike

我正在使用 BeautifulSoup 4,我正在使用带有正则表达式的 find_all 来查找与特定模式匹配的所有链接。

results = page.find_all(href=re.compile("foo/bar\?baz="))
for result in results:
...

但是我还想从 URL 中提取一个参数。

我可以通过在其上放置捕获组来标记要提取的参数:

results = page.find_all(href=re.compile("foo/bar\?baz=([^&]+)"))

但如果我这样做,我如何访问特定匹配中捕获组的值?

最佳答案

是的,你可以。使用魔术方法 __call__()__iter__() 创建辅助类,并将此类的实例作为函数提供给 BeautifulSoup find_all() 函数。我使用 zip() 将组与匹配的元素联系起来:

from bs4 import BeautifulSoup, Tag
import re

data = '''<div>
<a href="link_1">Link 1</a>
<a href="link_2">Link 1</a>
<a href="link_XXX">Link 1</a>
<a href="link_3">Link 1</a>
</div>'''

soup = BeautifulSoup(data, 'lxml')

class my_regex_searcher:
def __init__(self, regex_string):
self.__r = re.compile(regex_string)
self.groups = []

def __call__(self, what):
if isinstance(what, Tag):
what = what.name

if what:
g = self.__r.findall(what)
if g:
self.groups.append(g)
return True
return False

def __iter__(self):
yield from self.groups

searcher = my_regex_searcher(r'link_(\d+)')
for l, groups in zip(soup.find_all(href=searcher), searcher):
print(l)
print(groups)

searcher = my_regex_searcher(r'(d)(i)(v)')
for l, groups in zip(soup.find_all(searcher), searcher):
print(l.prettify())
print(groups)

打印:

<a href="link_1">Link 1</a>
['1']
<a href="link_2">Link 1</a>
['2']
<a href="link_3">Link 1</a>
['3']
<div>
<a href="link_1">
Link 1
</a>
<a href="link_2">
Link 1
</a>
<a href="link_XXX">
Link 1
</a>
<a href="link_3">
Link 1
</a>
</div>
[('d', 'i', 'v')]

关于python - 将 BeautifulSoup 4's ` find_all` 与正则表达式一起使用时,如何访问正则表达式匹配捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33192381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com