PHP前端开发

详解Python利用Beautiful Soup模块搜索内容方法

百变鹏仔 2小时前 #Python
文章标签 详解

这篇文章主要给大家介绍了python中 beautiful soup 模块的搜索方法函数。 方法不同类型的过滤参数能够进行不同的过滤,得到想要的结果。文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

前言

我们将利用 Beautiful Soup 模块的搜索功能,根据标签名称、标签属性、文档文本和正则表达式来搜索。

搜索方法

Beautiful Soup 内建的搜索方法如下:

立即学习“Python免费学习笔记(深入)”;

  • find()

  • find_all()

  • find_parent()

  • find_parents()

  • find_next_sibling()

  • find_next_siblings()

  • find_previous_sibling()

  • find_previous_siblings()

  • find_previous()

  • find_all_previous()

  • find_next()

  • find_all_next()

使用 find() 方法搜索

首先还是需要建立一个 HTML 文件用来做测试。


<p> </p>
   

我们可以通过 find() 方法来获得

我们不能再直接使用属性值来搜索了,而是得使用 attrs 参数来传递给 find() 函数。

根据自定义属性来搜索

在 HTML5 中是可以给标签添加自定义属性的,例如给标签添加 属性。

如下代码所示,如果我们再像搜索 id 那样进行操作的话,会报错的,Python 的变量不能包括 - 符号。


customattr = """ <p>custom attribute example</p>   """customsoup = BeautifulSoup(customattr,'lxml')customsoup.find(data-custom="custom")# SyntaxError: keyword can't be an expression

这个时候使用 attrs 属性值来传递一个字典类型作为参数进行搜索:


using_attrs = customsoup.find(attrs={'data-custom':'custom'})print using_attrs

基于 CSS 中的 类 进行搜索

对于 CSS 的类属性,由于在 Python 中 class 是个关键字,所以是不能当做标签属性参数传递的,这种情况下,就和自定义属性一样进行搜索。也是使用 attrs 属性,传递一个字典进行匹配 。

除了使用 attrs 属性之外,还可以使用 class_ 属性进行传递,这样与 class 区别开了,也不会导致错误。


css_class = soup.find(attrs={'class':'producerlist'})css_class2 = soup.find(class_ = "producerlist")print css_classprint css_class2

使用自定义的函数搜索

可以给 find() 方法传递一个函数,这样就会根据函数定义的条件进行搜索。

函数应该返回 true 或者是 false 值。


def is_producers(tag): return tag.has_attr('id') and tag.get('id') == 'producers'tag_producers = soup.find(is_producers)print tag_producers.li.p.string

代码中定义了一个 is_producers 函数,它将检查标签是否具体 id 属性以及属性值是否等于 producers,如果符合条件则返回 true ,否则返回 false 。

联合使用各种搜索方法

Beautiful Soup 提供了各种搜索方法,同样,我们也可以联合使用这些方法来进行匹配,提高搜索的准确度。


combine_html = """ <p>  Example of p tag with class identical </p> <p>  Example of p tag with class identical </p><p> """combine_soup = BeautifulSoup(combine_html,'lxml')identical_p = combine_soup.find("p",class_="identical")print identical_p</p>

使用 find_all() 方法搜索

使用 find() 方法会从搜索结果中返回第一个匹配的内容,而 find_all() 方法则会返回所有匹配的项。

在 find() 方法中用到的过滤项,同样可以用在 find_all() 方法中。事实上,它们可以用到任何搜索方法中,例如:find_parents() 和 find_siblings() 中 。


# 搜索所有 class 属性等于 tertiaryconsumerlist 的标签。all_tertiaryconsumers = soup.find_all(class_='tertiaryconsumerlist')print type(all_tertiaryconsumers)for tertiaryconsumers in all_tertiaryconsumers: print tertiaryconsumers.p.string

find_all() 方法为 :


find_all(name,attrs,recursive,text,limit,**kwargs)

它的参数和 find() 方法有些类似,多个了 limit 参数。limit 参数是用来限制结果数量的。而 find() 方法的 limit 就是 1 了。

同时,我们也能传递一个字符串列表的参数来搜索标签、标签属性值、自定义属性值和 CSS 类。


# 搜索所有的 p 和 li 标签p_li_tags = soup.find_all(["p","li"])print p_li_tagsprint# 搜索所有类属性是 producerlist 和 primaryconsumerlist 的标签all_css_class = soup.find_all(class_=["producerlist","primaryconsumerlist"])print all_css_classprint

搜索相关标签

一般情况下,我们可以使用 find() 和 find_all() 方法来搜索指定的标签,同时也能搜索其他与这些标签相关的感兴趣的标签。

搜索父标签

可以使用 find_parent() 或者 find_parents() 方法来搜索标签的父标签。

find_parent() 方法将返回第一个匹配的内容,而 find_parents() 将返回所有匹配的内容,这一点与 find() 和 find_all() 方法类似。


# 搜索 父标签primaryconsumers = soup.find_all(class_='primaryconsumerlist')print len(primaryconsumers)# 取父标签的第一个primaryconsumer = primaryconsumers[0]# 搜索所有 ul 的父标签parent_ul = primaryconsumer.find_parents('ul')print len(parent_ul)# 结果将包含父标签的所有内容print parent_ulprint# 搜索,取第一个出现的父标签.有两种操作immediateprimary_consumer_parent = primaryconsumer.find_parent()# immediateprimary_consumer_parent = primaryconsumer.find_parent('ul')print immediateprimary_consumer_parent

搜索同级标签

Beautiful Soup 还提供了搜索同级标签的功能。

使用函数 find_next_siblings() 函数能够搜索同一级的下一个所有标签,而 find_next_sibling() 函数能够搜索同一级的下一个标签。


producers = soup.find(id='producers')next_siblings = producers.find_next_siblings()print next_siblings

同样,也可以使用 find_previous_siblings() 和 find_previous_sibling() 方法来搜索上一个同级的标签。

搜索下一个标签

使用 find_next() 方法将搜索下一个标签中第一个出现的,而 find_next_all() 将会返回所有下级的标签项。


# 搜索下一级标签first_p = soup.pall_li_tags = first_p.find_all_next("li")print all_li_tags

搜索上一个标签

与搜索下一个标签类似,使用 find_previous() 和 find_all_previous() 方法来搜索上一个标签。