根据任何属性中的关键字过滤出带有美丽汤的元素
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'
挑战在于:
- 我有几千个url,关键字标志可以在不同的属性中用于不同的url
- 逻辑:if 'logo' in ANY(attribute for attribute in 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"))
这是一个 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'
挑战在于:
- 我有几千个url,关键字标志可以在不同的属性中用于不同的url
- 逻辑:if 'logo' in ANY(attribute for attribute in 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"))