1.一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。

以上代码是一个生态金字塔的简单展示,为了找到第一生产者,第一消费者或第二消费者,可以使用Beautiful Soup。

找到第一生产者:

生产者在第一个<url>标签里,因为生产者在整个html文档中第一个<url>标签中出现,所以可以使用find()方法找到第一生产者,在ecologicalpyramid.py

中写入下面一段代码,使用ecologicalpyramid.html文件创建BeautifulSoup对象。

from bs4 import BeautifulSoup
with open('ecologicalpyramid.html', 'r') as ecological_pyramid:    # ecological 生态系统 pyramid 金字塔
  soup = BeautifulSoup(ecological_pyramid)
producer_entries = soup.find('ul')
print(producer_entries.li.div.string)

输出结果:plants

2.find()

find函数:

find(name, attrs, recursive, text, **wargs)    # recursive 递归的,循环的

这些参数相当于过滤器一样可以进行筛选处理。不同的参数过滤可以应用到以下情况:

  • 查找标签,基于name参数
  • 查找文本,基于text参数
  • 基于正则表达式的查找
  • 查找标签的属性,基于attrs参数
  • 基于函数的查找

通过标签查找:

可以传递任何标签的名字来查找到它第一次出现的地方。找到后,find函数返回一个BeautifulSoup的标签对象。

from bs4 import BeautifulSoup

with open('ecologicalpyramid.html', 'r') as ecological_pyramid:
  soup = BeautifulSoup(ecological_pyramid, 'html')
producer_entries = soup.find('ul')
print(type(producer_entries)) 

输出结果: <class 'bs4.element.Tag'>

通过文本查找:

直接字符串的话,查找的是标签。如果想要查找文本的话,则需要用到text参数。如下所示:

from bs4 import BeautifulSoup

with open('ecologicalpyramid.html', 'r') as ecological_pyramid:
  soup = BeautifulSoup(ecological_pyramid, 'html')
producer_string = soup.find(text = 'plants')
print(plants_string)

输出:plants

通过正则表达式查找:

有以下html代码:

想找出第一个邮箱地址,但是第一个邮箱地址没有标签包含,所以通过其他方式很难找到。但是可以将邮箱地址进行正则表达式处理。

import re
from bs4 import BeautifulSoup email_id_example = """<br/>
<div>The below HTML has the information that has email ids.</div>
abc@example.com
<div>xyz@example.com</div>
<span>foo@example.com</span>
""" soup = BeautifulSoup(email_id_example)
emailid_regexp = re.compile("\w+@\w+\.\w+")    # regexp 表达式对象
first_email_id = soup.find(text=emailid_regexp)  
print(first_email_id)

输出结果:abc@example.com

通过标签属性进行查找:

上面html代码,其中第一个消费者在ul标签里面且id属性为priaryconsumer(priary consumer一次消费者,初级消费者)。

from bs4 import BeautifulSoup

with open('ecologicalpyramid.html', 'r') as ecological_pyramid:
soup = BeautifulSoup(eccological_pyramid, 'html')
primary_consumer = soup.find(id='primaryconsumers')
print(primary_consumer.li.div.string)

输出结果:deer

基于定制属性查找:

通过标签属性查找的方式适用大多数标签属性,包括id,style,title,但有 “-”,Class标签属性例外。

比如html5标签中的data-custom属性,如果我们这样

customattr = """<p data-custom='custom'>custo attribute
example</p>
"""
customsoup = BeautifulSoup(customattr, 'lxml')
customSoup.find(data-custom="custom")

那么则会报错。原因是在python中变量不能含有"-"这个字符,而我们传递的data-custom有这个字符。

解决办法是在attrs属性用字典进行传递参数。

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

基于css类的查找:

class是python的保留关键字,所以无法使用class这个关键字。

第一种方法:在attrs属性用字典进行传递参数

css_class = soup.find(attrs={'class':'primaryconsumers'})
print(css_class) 

第二种方法:BeautifulSoup中的特别关键字参数class_。

css_class = soup.find(class_ = 'primaryconsumers') 

基于定义的函数进行查找:

可以传递函数到find()来基于函数定义的条件查找。函数必须返回True或False。

def is_secondary_consumers(tag):
return tag.has_attr('id') and tag.get('id') == 'secondaryconsumers'
secondary_consumer = soup.find(is_secondary_consumers)
print(secondary_consumer.li.div.string)

输出:fox

将方法进行组合后进行查找:

可以用其中任何方法进行组合进行查找,比如同时基于标签名和id号。

3.find_all查找

find()查找第一个匹配结果出现的地方,find_all()找到所有匹配结果出现的地方。

查找所有3级消费者:

all_tertiaryconsumers = soup.find_all(class_ = 'tertiaryconsumerslist')        # tertiary第三的

其中all_tertiaryconsumers的类型是列表。

所以对其列表进行迭代,循环输出三级消费者的名字。

for tertiaryconsumer in all_tertiaryconsumers:
print(tertiaryconsumer.div.string) 

输出结果:

lion

tiger

find_all()的参数:

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

limit参数可以限制得到的结果的数目。

参照前面的邮件地址例子,得到所有邮件地址:

email_ids = soup.find_all(text=emailid_regexp)
print(email_ids)

输出结果:[u'abc@example.com',u'xyz@example.com',u'foo@example.com']

使用limit参数:

email_ids_limited = soup.find_all(text=emailid_regexp, limit = 2)
print(email_ids_limited)

限制得到两个结果,所以输出结果:[u'abc@example.com',u'xyz@example.com']

可以向find函数传递True或False参数,如果传递True给find_all(),则返回soup对象的所有标签。对于find()来说,则返回soup对象的第一个标签。

all_texts = soup.find_all(text=True)
print(all_texts)

输出结果:

同样,可以在传递text参数时传递一个字符串列表,那么find_all()会找到挨个在列表中定义过的字符串。

all_texts_in_list = soup.find_all(text=['plants', 'algae'])
print(all_texts_in_list)

输出结果:

[u'plants', u'alage']

这个同样适用于查找标签,标签属性,定制属性和CSS类。如:

div_li_tags = soup.find_all(['div', 'li'])

并且find()和find_all()都会查找一个对象所有后辈们,不过可以通过recursive参数控制。(recursive回归,递归)

如果recursive=False,只会找到该对象的最近后代。

通过标签之间的关系进行查找

查找父标签

通过find_parents()或find_parent()。它们之间的不同类似于find()和find_all()的区别。

find_parents()返回全部的相匹配的父标签,而find_parent()返回最近一个父标签。适用于find()的方法同样适用于这两个方法。

在第一消费者例子中,可以找到离Primaryconsumer最近的ul父标签。

primaryconsumers = soup.find_all(class_ = 'primaryconsumerlist')
primaryconsumer = primaryconsumers[0]
parent_ul = primaryconsumer.find_parents('ul')
print(parent_ul)

一个简单的找到一个标签的父标签的方法是使用find_parent()却不带任何参数。

immediateprimary_consumer_parent = primary_consumer.find_parent()

查找同胞

标签在同一个等级,这些标签是同胞关系,比如参照上面金子塔例子,所有的ul标签就是同胞的关系。上面的ul标签下的producers,primaryconsumers,,

secondaryconsumers,teriaryconsumers就是同胞关系。

div下的plants和algae不是同胞关系,但是plants和临近的number是同胞关系。

Beautiful Soup自带查找同胞的方法。

比如find_next_siblings()和find_next_sibling()查找对象下面的同胞。(sibling兄弟姐妹)

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

输出结果将会输出与之临近的下面的所有同胞html代码。

查找下一个

对每一个标签来说,下一个元素可能会是定位字符串,标签对象或者其他BeautifulSoup对象,我们定义下一个元素为当前元素最靠近的元素 。

这不用于同胞定义,我们有方法可以找到我们想要标签的下一个其他元素对象。find_all_next()找到与当前元素最靠近的所有对象。而find_next()找到离当前元素最接近的对象。

比如,找到在第一个div标签后的所有li标签

first_div = soup.div
all_li_tags = first_div.find_all_next('li')

查找上一个

与查找下一个相反的是查找前一个,用find_previous()和find_all_previous()。

BeautifulSoup中的find,find_all的更多相关文章

  1. 初识python 之 爬虫:BeautifulSoup 的 find、find_all、select 方法

    from bs4 import BeautifulSoup lxml 以lxml形式解析html,例:BeautifulSoup(html,'lxml') #  注:html5lib 容错率最高fin ...

  2. BeautifulSoup中查找元素 select() 和find()区别

    从html中查找元素,之前一般都用find(),查找符合条件的第一个,如下 f = open(file, 'r') # 读取文件内容content = f.read()soup= BeautifulS ...

  3. Python中BeautifulSoup中对HTML标签的提取

    一开始使用了beautifulSoup的get_text()进行字符串的提取,后来一直提取失败,并提示错误为TypeError: 'NoneType' object is not callable 返 ...

  4. BeautifulSoup中的select方法

    在写css时,标签名不加任何修饰,类名前加点,id名前加 #,我们可以用类似的方法来筛选元素,用到的方法是soup.select(),返回类型是list. (1).通过标签名查找 print(soup ...

  5. BeautifulSoup中各种html解析器的比較及使用

    Beautiful Soup解析器比較 ·Beautiful Soup支持各种html解析器.包含python自带的标准库.还有其它的很多第三方库模块. 当中一个就是lxml parser,至于lxm ...

  6. BeautifulSoup 库的使用记录

    BeautifulSoup 有何用途 如果我们需要通过脚本来抓取网络中的数据时,使用传统的字符解析等方法时是非常低效的,而BeautifulSoup则可以方便的通过接口来获取标签中所想要得到的数据.主 ...

  7. Python3中BeautifulSoup的使用方法

    BeautifulSoup的使用 我们学习了正则表达式的相关用法,但是一旦正则写的有问题,可能得到的就不是我们想要的结果了,而且对于一个网页来说,都有一定的特殊的结构和层级关系,而且很多标签都有id或 ...

  8. Python爬虫小白入门(三)BeautifulSoup库

    # 一.前言 *** 上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. ...

  9. BeautifulSoup :功能使用

    # -*- coding: utf-8 -*- ''' # Author : Solomon Xie # Usage : 测试BeautifulSoup一些用法及容易出bug的地方 # Envirom ...

随机推荐

  1. [LeetCode] 200. Number of Islands_ Medium tag: BFS

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...

  2. Are you looking forward to this 11s Black Stingray

    The Derek Jeter Air Jordan 11 Navy Suede has quietly dropped a number of various colorways over the ...

  3. Lintcode: Hash Function && Summary: Modular Multiplication, Addition, Power && Summary: 长整形long

    In data structure Hash, hash function is used to convert a string(or any other type) into an integer ...

  4. SQL中SELECT INTO和INSERT INTO SELECT语句介绍

    表复制是经常要用到的操作,下面就将为您介绍SQL中SELECT INTO和INSERT INTO SELECT语句,供您参考. Insert是T-sql中常用语句,Insert INTO table( ...

  5. 混合高斯模型(Mixtures of Gaussians)

    http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006924.html 这篇讨论使用期望最大化算法(Expectation-Maximizat ...

  6. SQL Server报“GUID应包含带4个短划线的32位数”

    转自:http://www.seayee.net/article/info_106.html 最近在配置一台服务器的MS SQL Server 2005的维护计划自动备份数据库,能创建维护计划,但设置 ...

  7. linux基础命令---umask

    umask 指定创建文件时所需要的权限掩码,掩码的执行权限对于文件没有效果.如果模式以数字开头,则解释为八进制数字:否则解释为符号模式掩码,类似于chmod(1)所接受的模式掩码.如果省略模式,则打印 ...

  8. 怎么归档老日志的shell脚本

    本脚本来自有学习阿铭的博文学习:工作中,需要用到日志切割logrotate,按照各自的需要切割.定义保留日志.提示:本文中的S全部都$符,不要问为什么,马云爸爸的社区就这样. #用途:日志切割归档.按 ...

  9. 如何在Linux环境下通过uwgsi部署Python服务

    部署python程序时常常会遇到同一台服务器上2.x和3.x共存的情况,不同应用需要使用不用的python版本,使用virtualenv创建虚拟环境能很好地解决这一问题. 首先,需要在服务器上安装vi ...

  10. Python 技术点

    1.文件操作 1-1 遍历文件夹和文件 import os rootDir = "/path/to/root" for parent, dirnames, filenames in ...