BeautifulSoup库之find_all函数

Posted lh2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BeautifulSoup库之find_all函数相关的知识,希望对你有一定的参考价值。

  BeautifulSoup将复杂的html文档转换成一个复杂的树形结构.每个节点都是Python对象.所有对象可以归纳为四种:Tag , NavigableString , BeautifulSoup , Comment .

    1.Tag对象最重要的属性:Name:标签的名字;attributes:属性(用class指代)

    2.BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法.因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的 .name 属性是很方便的,所以 BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name

    3.字符串常被包含在tag内.Beautiful Soup用 NavigableString 类来包装tag中的字符串,如果想在Beautiful Soup之外使用 NavigableString 对象,需要调用 unicode() 方法,将该对象转换成普通的Unicode字符串,否则就算Beautiful Soup已方法已经执行结束,该对象的输出也会带有对象的引用地址.这样会浪费内存.

    4.Comment 对象是一个特殊类型的 NavigableString 对象,用来完成文本注释.

  既然BeautifulSoup将html文档转换为复杂的树形结构,然后来介绍如何遍历html文档树:

    子节点:.contents将子节点以列表的方式输出(含内容);.children返回子节点的列表生成器,可以遍历输出;contents和children只查找第一个子节点,而.descendants可对所有子节点进行递归循环;

    父节点:.parent 属性来获取某个标签或字符串的父节点;.parents 属性可以递归得到元素的所有父辈节点

    兄弟节点:.next_sibling获取下一个兄弟节点; .previous_sibling获取前一个兄弟节点,同样加s返回所有前或者后兄弟的列表生成器,可遍历输出.

  接下来介绍find_all()函数,首先要明确find_dall总返回一个列表,如果没有找到则返回空:BeautifulSoup提供了强大的搜索函数find 和findall,这里的两个方法(findAll和 find)仅对Tag对象以及,顶层剖析对象有效。其标准引用形式为:findAll(name, attrs, recursive, text, limit, **kwargs)

  1.通过标签名查找:

1 for link in soup.find_all(a): #soup.find_all返回的为列表
2     print(link.get(href))

  2.通过标签属性值查找:

  

1 pid=soup.findall(p,id=hehe)  #通过tag的id属性搜索标签
 #print(soup.find_all(attrs={‘class‘:‘footer‘}))

  3.通过re正则表达式搜索tag标签内容:

pid=soup.findAll(id=re.compile("he$")) #正则表达式的使用

 

 

    

 

 

---恢复内容结束---


以上是关于BeautifulSoup库之find_all函数的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup find_all 方法没有泛化

find_all的用法 Python(bs4,BeautifulSoup)

BeautifulSoup 中“findAll”和“find_all”的区别

BeautifulSoup.find_all() 方法不适用于命名空间标签

BeautifulSoup 从 find_all 的结果中找到 url

BeautifulSoup 不会使用 .find_all('a') 抓取页面中的所有锚标记。我忽略了啥吗?