Beautiful Soup爬虫中使用attrs的原因及attrs与tag的区别是什么
Beautiful Soup中tag匹配与attrs参数的区别
首先明确二者的核心作用差异:
- tag匹配是
find_all()方法的第一个位置参数,仅用来匹配HTML/XML节点的标签名称,比如传入'a'只会筛选所有<a>标签,传入'div'只会筛选所有<div>标签,不会对标签的属性、文本内容做任何筛选。 - attrs是
find_all()方法的可选关键字参数,专门用来匹配HTML/XML节点的属性键值对,不限制标签类型,只要节点的属性符合你传入的规则就会被选中,你可以同时传入多个属性规则做复合筛选。
结合你遇到的场景做解释:
你现在可以用attrs={'class': 'title'}匹配到目标,但直接用tag匹配不到,是因为你要找的目标节点本身的标签名不是title,只是它的class属性值为title,比如目标节点结构大概率是<div class="title">、<p class="title">这类。如果你直接写soup.find_all('title'),只会匹配到HTML头部用来定义网页标题的原生<title>标签,这个节点下没有你要的<a>子标签,自然抓不到内容。
可以参考下面的示例HTML结构理解:
<!-- 你要匹配的目标节点 --> <div class="title"> <a href="https://example.com">目标链接</a> </div> <!-- tag匹配'title'时只会命中这个节点 --> <title>当前网页标题</title>
执行
soup.find_all('title')只能拿到上面的<title>节点,没有子级<a>标签
执行soup.find_all(attrs={'class': 'title'})可以拿到<div class="title">节点,内层循环可以正常提取子级<a>标签
内容的提问来源于stack exchange,提问作者hass
相关产品推荐
相关产品推荐

