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就可以帮你简化这些操 ...
随机推荐
- 随机法解决TSP问题
TSP问题一直是个头疼的问题,但是解决的方法数不胜数,很多的算法也都能解决.百度资料一大堆,但是我找到了代码比较简练的一种.随机法.下面只是个人的看法而已,如果有任何问题虚心接受. 顾名思义,随机法就 ...
- (一)、Struts第一天
(一).Struts第一天 1. JavaWeb知识回顾 n 客户端编程 HTLM/CSS/JS n XML技术 会写XML * 基本语法 * DTD * Schema 会读XML * Dom4J读取 ...
- Hibernate中,将session绑定到线程时,在保存和查询数据的代码里,要正确的关闭session
比如有个保存的方法 // 保存 public void save(){ Transaction t = XXX Session s = getSession.beginTransaction(); X ...
- Android SharedPreferences存图片,转码解码图片
保存图片 首先创建ByteArrayStream对象,然后用BitmapFactroy把图片加载进来,然后compress压缩图片到流, 然后toByteArray()就行了 public voi ...
- Android 下得到 未安装APK包含信息 等
很多情况下,我们需要通过APK文件来得到它的一些信息. (此时此APK不一定被安装了) 0. 基础知识:可以通过android.content.Context的方法 getPackageManager ...
- ant语法和规范
一.前言: 以前在做JavaEE项目的时候曾经听说过这个名字,但是由于没有用到,所以也没有去学习.最近在研究Android打包的时候,看了下build.xml文件,甚是迷糊,于是学习一下,稍有心得. ...
- HDU 1887 Weird Numbers(负数的进制转化)
题目要求有两种情况,第一种from情况,正常输出即可,很简单.第二种是to情况,给一个数字,输出负进制R的原码,这个有点小麻烦...解决方法如下; 首先,把这个数n按正常方式展开,形式如下: .... ...
- HDU 1114 Piggy-Bank(判断是否恰好装满的背包)
其实这道题在寒假自学训练赛的时候就做过,不过感觉现在的理解跟当时真的不一样,大一半年过去了,变了这么多,我们都在进步,一回头便走出了这么远... 好了,题目很简单,一个背包,装不满做一个标记就行了 # ...
- Linux服务器自动备份压缩MySQL数据库的实用方法
<?php$server = 'localhost'; $link = mysql_connect($server, 'root', 'haven'); $result = mysql_quer ...
- 杀死进程kill和fuser
1 kill -9 id 2 不行的话使用 fuser -k -SIGHUP /opt/bre/cookiemapping/wsapi/123 fuser有一个特别的用法在于它可以一次杀死那 ...