如何在BeautifulSoup中获取bs4.elements.tag的所有链接属性(href/src/url等)
解决方案
核心思路是不指定固定属性名,遍历单个标签的所有属性,对属性值进行URL合法性校验,匹配成功就提取,完全不需要提前硬编码href/src/url这类属性名。
你可以参考下面的实现代码:
import bs4 from urllib.parse import urlparse def is_valid_url(value): # 自定义URL校验规则,可根据自己的需求调整 try: result = urlparse(value) # 示例规则:只要有协议和域名就算合法URL return all([result.scheme, result.netloc]) except: # 非字符串类型的属性值直接判定为不合法 return False # 原有解析逻辑 soup = bs4.BeautifulSoup(some_response.text, "html.parser") # find_all传True表示匹配所有标签,也可以指定标签列表缩小范围,比如['a','img','iframe'] all_tags = soup.find_all(True) for tag in all_tags: # 遍历当前标签的所有属性 for attr_name, attr_value in tag.attrs.items(): # 处理多值属性(比如class属性会返回列表) if isinstance(attr_value, list): for val in attr_value: if is_valid_url(val): print(f"标签名:{tag.name},属性名:{attr_name},链接:{val}") else: if is_valid_url(attr_value): print(f"标签名:{tag.name},属性名:{attr_name},链接:{attr_value}")
你可以根据自己的业务场景调整规则:
- 如果只需要匹配http/https开头的链接,可以在校验逻辑中增加
result.scheme in ('http', 'https')的判断,过滤掉ftp、mailto等其他协议的内容 - 如果需要匹配相对路径链接,可以调整校验规则,比如判断字符串是否以
/、./、../开头,不需要强制要求存在协议和域名 - 如果遍历全页面标签效率太低,可以限定只遍历a、img、script、link、iframe这类常用带链接属性的标签,缩小搜索范围
内容的提问来源于stack exchange,提问作者cdpp
相关产品推荐
相关产品推荐

