文档章节

python爬虫日志(5)find(),find_all()函数

茫羽行
 茫羽行
发布于 07/22 15:20
字数 1840
阅读 15
收藏 2

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()。

本文转载自:https://www.cnblogs.com/keye/p/7868059.html

共有 人打赏支持
茫羽行
粉丝 5
博文 19
码字总数 5983
作品 0
丰台
一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者
04/25
0
0
Python--(爬虫与数据库的连接)

(每一天都是属于你的!) Python对于初学后巩固基础的人还是更多的来接触python爬虫会更好一些,在Python爬虫中包含很多基础部分知识,并且在项目中会提升你的成功感!加油! 我在工作之余时...

jamesjoshuasss
06/08
0
0
买《Python从小白到大牛》专题视频课程,送配套纸质图书

经过一年多时间的呕心沥血,Python立体化图书——《Python从小白到大牛》即将与大家见面了。所谓立体化图书包括:电子图书、视频、课件和服务等内容。 《Python从小白到大牛》纸质图书将于9...

tony关东升
07/23
0
0
python简单应用!用爬虫来采集天猫所有优惠券信息,写入本地文件

今天给大家分享一个小网站的数据采集,并写到excel里面! 分析网站 目标网站是“小咪购”,这里有天猫所有的含有购物券的商品信息,我们今天就来抓它吧! 随便找一段文字,然后点击右键查看网...

python玩家
07/24
0
0
Python爬虫代码:淘宝、豆瓣、知乎、微博、QQ、简书等

[0] 一份Python爬虫电子书 https://zhuanlan.zhihu.com/p/28865834 [1] 爬取网易云音乐所有歌曲的评论 https://github.com/RitterHou/music-163 [2] python爬虫代理IP池(proxy pool) https:......

大数据之路
2012/12/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS三元运算示例

1. topFlag=topFlag ==0?1:0; 等于 if(topFlag=00){ topFlag=1; }else if(topFlag == 1){ topFlag=0; } 2. 5>3?alert('5大'):alert('3大'); 即 if(5>3){alert('5大')}else{alert('3大')}; 注......

森火
今天
0
0
利用Slf4j的MDC跟踪方法调用链

why? 一个web项目通常提供很多URL访问地址, 项目一般都是分层处理,例如Controller——>Service——>DAO。 如果想根据日志查看用户一次请求都走了哪些方法(多数是查错误)。 如果系统是多人...

杨春炼
今天
10
0
Maven介绍及安装

Maven介绍及安装 以下内容是本人早期学习时的笔记,可能比较详实繁琐,现在复习一下Maven,顺便将内容抛出来,供大家一起学习进步。 一、Maven简介 Maven是Apache旗下的一款项目管理工具,是...

星汉
今天
0
0
小程序Aes解密

主要步骤: 1、下载AES源码(JS版) 2、在小程序中新建一个公共的文件夹,把AES源码拷贝进去(注意:需要暴露接口 module.exports = CryptoJS;) 3、添加一个用于加密解密的公共JS,可取名为...

Mr_Tea伯奕
今天
0
0
Go实现文件传输(基本传输可用)

发送端 package mainimport ("fmt""os""net""io")func SendFile(path string, connect net.Conn){file, oerr :=os.Open(path)if oerr !=nil{fmt.Println("Open", oerr)......

CHONGCHEN
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部