python-3.x - 根据任何属性中的关键字过滤掉与美丽汤一起发现的元素
问题描述
这是一个 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”的条件从所有元素中过滤掉这个元素
挑战在于:
- 我有数千个 url,关键字 logo 可能在不同的属性中用于不同的 url
- 逻辑:如果 ANY 中的“徽标”(list_of_possible_attributes_that_this_element_has 中的属性的属性)与列表推导式的工作方式不同,因为我找不到在不使用其特定名称的情况下如何访问任何可能属性的方法
- 检查所有特定名称也是有问题的,因为特定属性可能存在于一个元素中,而不存在于另一个元素中,这会引发错误
- 上面的例子也更具挑战性,因为属性值是一个列表,所以我们需要将其展平才能检查关键字是否在其中。
- 对于大多数 url,我正在寻找的元素不会像本示例中那样作为顶部返回,因此不能选择顶部优先。
有没有办法根据其任何属性中的关键字过滤掉元素?(事先不知道属性的名称是什么?)。
解决方案
如果我理解正确,您可以使用类似于此答案的过滤器功能来搜索所有标签,以便任何标签属性的值包含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"))
推荐阅读
- java - 事件发生后更新 javafx 中文本字段的值
- sql - MS Access VBA 代码根据表单上的组合框选择运行特定查询
- c++ - C ++有效查找向量中第一个最近的匹配值?
- python - python脚本替换IP地址的第三个字节
- php - PHP:在坏词混淆器中使用特殊字符
- python - 从循环返回根 - Python
- python - 'NoneType' 对象没有属性 'evaluate' 错误与 keras 中的 hyperas
- r - 如何同时读取 excel 工作表并使用 purrr/dplyr 改变新列?
- html - 如何用 CSS 绘制多边形背景?
- vba - 在范围内查找和递增计数器