Beautiful Soup 定位指南
Reference: http://blog.csdn.net/abclixu123/article/details/38502993
网页中有用的信息通常存在于网页中的文本或各种不同标签的属性值,为了获得这些网页信息,有必要有一些查找方法可以获取这些文本值或标签属性。而Beautiful Soup中内置了一些查找方式:
- 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是例程要用到的参考网页
- <html>
- <body>
- <div class="ecopyramid">
- <ul id="producers">
- <li class="producerlist">
- <div class="name">plants</div>
- <div class="number">100000</div>
- </li>
- <li class="producerlist">
- <div class="name">algae</div>
- <div class="number">100000</div>
- </li>
- </ul>
- <ul id="primaryconsumers">
- <li class="primaryconsumerlist">
- <div class="name">deer</div>
- <div class="number">1000</div>
- </li>
- <li class="primaryconsumerlist">
- <div class="name">rabbit</div>
- <div class="number">2000</div>
- </li>
- <ul>
- <ul id="secondaryconsumers">
- <li class="secondaryconsumerlist">
- <div class="name">fox</div>
- <div class="number">100</div>
- </li>
- <li class="secondaryconsumerlist">
- <div class="name">bear</div>
- <div class="number">100</div>
- </li>
- </ul>
- <ul id="tertiaryconsumers">
- <li class="tertiaryconsumerlist">
- <div class="name">lion</div>
- <div class="number">80</div>
- </li>
- <li class="tertiaryconsumerlist">
- <div class="name">tiger</div>
- <div class="number">50</div>
- </li>
- </ul>
- </body>
- </html>
以上代码是一个生态金字塔的简单展示,为了找到其中的第一生产者,第一消费者或第二消费者,我们可以使用Beautiful Soup的查找方法。一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,我们可以使用find()方法。
找到第一生产者
可以明显看到,生产者在第一个<ul>标签里,因为生产者是在整个HTML文档中第一个<ul>标签中出现,所以可以简单的使用find()方法找到第一生产者。下图HTML树代表了第一个生产者所在位置。
然后在ecologicalpyramid.py中写入下面一段代码,使用ecologicalpyramid.html文件创建BeautifulSoup对象。
- from bs4 import BeautifulSoup
- with open("ecologicalpyramid.html","r") as ecological_pyramid:
- soup = BeautifulSoup(ecological_pyramid)
- producer_entries = soup.find("ul")
- print(producer_entries.li.div.string)
输出得到:plants
find()说明
find()函数如下:
find(name,attrs,recursive,text,**wargs)
这些参数相当于过滤器一样可以进行筛选处理。
不同的参数过滤可以应用到以下情况:
- 查找标签,基于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")
- plants_string = soup.find(text="plants")
- print(plants_string)
输出:plants
通过正则表达式查找
有以下HTML代码:
- <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>
如果想找出第一个邮箱地址,但是由于第一个邮箱地址没有标签包含,所以通过其他方式很难找到。但是我们可以把邮箱地址进行正则表达式处理,这样就容易多了。
参考如下代码:
- 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+")
- first_email_id = soup.find(text=emailid_regexp)
- print(first_email_id)
输出:abc@example.com
通过标签属性进行查找
观看例程HTML代码,其中第一消费者在ul标签里面且id属性为priaryconsumers.
因为第一消费者出现的ul不是文档中第一个ul,所以通过前面查找标签的办法就行不通了。现在通过标签属性进行查找,参考代码如下:
- from bs4 import BeautifulSoup
- with open("ecologicalpyramid.html", "r") as ecological_pyramid:
- soup = BeautifulSoup(ecological_pyramid,"html")
- primary_consumer = soup.find(id="primaryconsumers")
- print(primary_consumer.li.div.string)
输出:deer
通过标签属性查找的方式适用于大多数标签属性,包括id,style,title,但是有一组标签属性例外。
- Custom attrbutes
- Class
基于定制属性的查找
- customattr = ""'<p data-custom="custom">custom attribute
- example</p>"""
- customsoup = BeautifulSoup(customattr,'lxml')
- customSoup.find(data-custom="custom")
那么则会报错。原因是在Python中变量不能呢含有-这个字符,而我们传递的data-custom有-这个字符。
- using_attrs = customsoup.find(attrs={'data-custom':'custom'})
- print(using_attrs)
基于CSS类的查找
- css_class = soup.find(attrs={'class':'primaryconsumerlist'})
- print(css_class)
还有另一个办法。BeautifulSoup有一个特别的关键字参数class_。示例:
- css_class = soup.find(class_ = "primaryconsumers" )
方法2:
- css_class = soup.find(attrs={'class':'primaryconsumers'})
基于定义的函数进行查找
- 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
把方法进行组合后进行查找
使用find_all查找
查找所有三级消费者
- all_tertiaryconsumers =
- soup.find_all(class_="tertiaryconsumerslist")
其all_tertiaryconsumers的类型是列表。
- for tertiaryconsumer in all_tertiaryconsumers:
- print(tertiaryconsumer.div.string)
输出:
理解用于find_all()的参数
- email_ids = soup.find_all(text=emailid_regexp)
- print(email_ids)
输出:[u'abc@example.com',u'xyz@example.com',u'foo@example.com']
- email_ids_limited = soup.find_all(text=emailid_regexp,limit=2)
- print(email_ids_limited)
限制得到两个结果,所以输出为:
- all_texts = soup.find_all(text=True)
- print(all_texts)
输出:
u'\n', u'\n', u'\n', u'algae', u'\n', u'100000', u'\n', u'\n',
u'\n', u'\n', u'\n', u'deer', u'\n', u'1000', u'\n', u'\n',
u'\n', u'rabbit', u'\n', u'2000', u'\n', u'\n', u'\n',
u'\n', u'\n', u'fox', u'\n', u'100', u'\n', u'\n', u'\n',
u'bear', u'\n', u'100', u'\n', u'\n', u'\n', u'\n',
u'\n', u'lion', u'\n', u'80', u'\n', u'\n', u'\n',
u'tiger', u'\n', u'50', u'\n', u'\n', u'\n', u'\n',
u'\n']
- all_texts_in_list = soup.find_all(text=["plants","algae"])
- print(all_texts_in_list)
输出:
- [u'plants', u'algae']
这个同样适用于查找标签,标签属性,定制属性和CSS类。如:
- div_li_tags = soup.find_all(["div","li"])
find()和find_all()都会查找一个对象所有后辈们,不过我们可以控制它通过recursive参数。如果recursive=False,那么超找只会找到该对象的最近后代。
通过标签之间的关系进行查找
查找父标签
- 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()
查找同胞
- producers= soup.find(id='producers')
- next_siblings = producers.find_next_siblings()
- print(next_siblings)
将会输出与之临近的下面的所有同胞HTML代码。
查找下一个
- first_div = soup.div
- all_li_tags = first_div.find_all_next("li")
输出“:
<div class="name">plants</div>
<div class="number">100000</div>
</li>, <li class="producerlist">
<div class="name">algae</div>
<div class="number">100000</div>
</li>, <li class="primaryconsumerlist">
<div class="name">deer</div>
<div class="number">1000</div>
</li>, <li class="primaryconsumerlist">
<div class="name">rabbit</div>
<div class="number">2000</div>
</li>, <li class="secondaryconsumerlist">
<div class="name">fox</div>
<div class="number">100</div>
</li>, <li class="secondaryconsumerlist">
<div class="name">bear</div>
<div class="number">100</div>
</li>, <li class="tertiaryconsumerlist">
<div class="name">lion</div>
<div class="number">80</div>
</li>, <li class="tertiaryconsumerlist">
<div class="name">tiger</div>
<div class="number">50</div>
</li>]
Beautiful Soup 定位指南的更多相关文章
- Python Beautiful Soup学习之HTML标签补全功能
Beautiful Soup是一个非常流行的Python模块.该模块可以解析网页,并提供定位内容的便捷接口. 使用下面两个命令安装: pip install beautifulsoup4 或者 sud ...
- Windows下安装BeautifulSoup4显示'You are trying to run the Python 2 version of Beautiful Soup under Python 3.(`python setup.py install`) or by running 2to3 (`2to3 -w bs4`).'
按照网上教程,将cmd的目录定位到解压缩文件夹地址,然后 >>python setup.py install ( Window下不能直接解压tar.giz文件,可以使用7z解压软件提取解压 ...
- Beautiful Soup解析网页
使用前步骤: 1.Beautiful Soup目前已经被移植到bs4,所以导入Beautiful Soup时先安装bs4库. 2.安装lxml库:如果不使用此库,就会使用Python默认的解析器,而l ...
- 爬虫---Beautiful Soup 初始
我们在工作中,都会听说过爬虫,那么什么是爬虫呢? 什么是网络爬虫 爬虫基本原理 所谓网络爬虫就是一个自动化数据采集工具,你只要告诉它要采集哪些数据,丢给它一个 URL,就能自动地抓取数据了.其背后的基 ...
- 爬虫---Beautiful Soup 爬取图片
上一篇简单的介绍Beautiful Soup 的基本用法,这一篇写下如何爬取网站上的图片,并保存下来 爬取图片 1.找到一个福利网站:http://www.xiaohuar.com/list-1-1. ...
- 【Python】使用Beautiful Soup等三种方式定制Jmeter测试脚本
背景介绍 我们在做性能调优时,时常需要根据实际压测的情况,调整线程组的参数,比如循环次数,线程数,所有线程启动的时间等. 如果是在一台Linux机器上,就免不了在本机打开图形页面修改,然后最后传递到压 ...
- 使用Beautiful Soup编写一个爬虫 系列随笔汇总
这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup
开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...
- Python爬虫学习(11):Beautiful Soup的使用
之前我们从网页中提取重要信息主要是通过自己编写正则表达式完成的,但是如果你觉得正则表达式很好写的话,那你估计不是地球人了,而且很容易出问题.下边要介绍的Beautiful Soup就可以帮你简化这些操 ...
随机推荐
- JavaScript(四)---- 函数
函数主要用来封装具体的功能代码. 函数是由这样的方式进行声明的:关键字 function.函数名.一组参数,以及置于括号中的待执行代码. 格式: function 函数名(形参列表){ ...
- 别说你不知道java中的包装类,wrapper type,以及容易在自动拆箱中出现的问题
很多时候,会有人问你,你知道什么是包装类吗? 或者高端一点问你你知道,wrapper type,是什么吗? 然后你就懵逼了,学了java很多时候都不知道这是啥. 其实问你的人,可能只是想问你,java ...
- 转:Emmet 学习之路 - 2 基本语法
http://blog.csdn.net/jizhongchun/article/details/8472755 导读:Emmet的基本语法.学习步骤是:1 基本语法: 2 html命令: 3 css ...
- 草,又学了个新命令,nc传文件。
nc -l 5222 > aa nc 192.168.0.48 5222 < a http://www.linuxso.com/command/nc.html
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...
- 12C 连接方式和 Oracle Easy Connect Naming method
1.12C 连接方式 PDB is not an instance, so using SID in the connection string will not work. When the dat ...
- 【抽屉定理】 组合数学poj2356
假定n个数为a1,a2,...,an,前n项和分别是S1.S2.....Sn,那么如果有一个Si模n是0,就是答案,否则,n个数模n的余数只能在 1到n - 1之间,把余数作为抽屉,显然n个数放到n ...
- Android------自定义ListView详解
引自:http://www.cnblogs.com/phonegap/archive/2011/04/28/2535732.html 在这里我就对自定义ListView进行讲解下吧,直入真题吧,首先我 ...
- iOS 热更新插件
1.JSPatch 平台 http://jspatch.com/Docs/intro 2.React Native 中文文档 http://wiki.jikexueyuan.com/project/r ...
- Windows Server 2012 在个人终端上使用的推荐设置
Windows Server 2012,也就是 Windows 8 的服务器版本,相对于 Windows 8 企业版而言,增强了作为服务器的功能,弱化了作为终端系统的功能. 目前微软官方提供了 Win ...