首页 > 解决方案 > 根据任何属性中的关键字过滤掉与美丽汤一起发现的元素

问题描述

这是一个 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 个元素。然后我想过滤这些元素,只显示那些在 ANY 属性中具有关键字“logo”的元素。

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

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

我想根据它在任何属性中都有关键字“logo”的条件从所有元素中过滤掉这个元素

挑战在于:

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

标签: python-3.xbeautifulsoupattributesselenium-chromedriverfiltering

解决方案


如果我理解正确,您可以使用类似于此答案的过滤器功能来搜索所有标签,以便任何标签属性的值包含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"))

推荐阅读