根据任何属性中的关键字过滤出带有美丽汤的元素

filtering out elements found with beautiful soup based on a key word in any attribute

这是一个 url 的例子。

url = 'https://rapaxray.com'
# logo
html_content = requests.get(url, headers=headers).text
soup = BeautifulSoup(html_content, "lxml")
images_found = soup.findAll('img', {'src' : re.compile(r'(jpe?g)|(png)|(svg)$')})
images_found

首先,我将元素列表缩小到标签中包含 jpg、png 或 svg 的元素。在这种情况下,我只得到 3 个元素。然后我想过滤这些元素以仅向我显示在任何属性中具有关键字 'logo' 的元素。

我在此示例中要查找的元素如下所示:

'img alt="Radiology Associates, P.A." class="attachment-full size-full astra-logo-svg" loading="lazy" src="https://rapaxray.com/wp-content/uploads/2019/09/RAPA100.svg"/'

我想从所有元素中过滤掉这个元素,条件是它在任何属性中都有关键字 'logo'

挑战在于:

有没有一种方法可以根据其任何属性中的关键字过滤掉元素? (事先不知道属性的名称是什么?)。

如果我没理解错的话,您可以使用类似于 的过滤函数来搜索所有标签,这样任何标签属性的值都包含 val:

def my_filter(tag, val):
    types = ['.jpg','.jpeg','.svg','.png']
    if tag is not None and tag.name == "img" and tag.has_attr("src"):
        if all(y not in tag['src'] for y in types):
            return False
        for key in tag.attrs.keys():
            if isinstance(tag[key], list):
                if any(val in entry for entry in tag[key]):
                    return True
            else:
                if val in tag[key]:
                    return True
    return False

res = soup.find_all(lambda tag: my_filter(tag, "logo"))