python BeautifulSoup
之前解析LXML,用的是XPath,现在临时被抓取写爬虫,接人家的代码,看到用的是BeautifulSoup,稍微学了下,也挺好用的,简单记录下用法,有机会做下和Xpath的对比测试
初始化
from bs4 import BeautifulSoup soup = BeautifulSoup(html,"lxml")
得到soup之后,就开始提取一些比较有用的信息,比如标题:可以直接使用
soup.title
得到的结果,是带标签的,类似这种形式:<title>title</title>,但显然我们只要里面的有效信息,当然简单粗暴的话,直接用正则表达式,拿出来也是OK的
前面API不熟,项目又催的紧,我就这么干的,现在普及下他的API
print soup.title.string
print soup.title.next
print soup.title.next_element
这些都是可以得到里面那个title的,但是注意下,string的话,对于里面有多个标签的,不太好使。类似这种:<p class="hello" id="1">hello1<strong> world</strong></p>
对于这种情况,就需要使用下strings,如下所示:
pc= soup.body.p
print pc
print pc.string
for s in pc.strings:
print s
另外要注意的一点是:直接用soup.tag的方式,是得到第一个元素的,当有多个元素同样的元素,需要提取的时候,不太好使,这时候需要使用下他的find_all函数,例如:
<html>
<title>title</title>
<body>
<p id='1' class='hello'>hello1<strong> world</strong></p>
<p id='2'>hello2
</p>
<p id='3'>hello3</p>
<p id='4'>hello4</p>
<img src="abc.jpeg"/>
<a href="http://www.baidu.com"></a>
</body>
</html>
我要提取所有的p中的元素,可以使用:
print soup.body.find_all("p")
当然,如果我只想要那个有class的p,怎么搞呢?
print soup.body.find_all("p",attrs={"class":"hello"})
依次类推,我们可以只提取id=3的p
那么问题来了,我现在想要找那个有class属性的p的id,怎么搞
很简单,找到对应的p之后,我们使用p['id']即可得到那个id对应的value了,但是要注意的是我们使用的是find_all方法,找到的p肯定是多个(虽然在我们这个例子里面只有一个),所以想说的是,给的肯定是一个集合,所以我们需要注意下这点:
p= soup.body.find_all("p",attrs={"class":"hello"})
print type(p)
print p[0]['id']
有了find_all之后,有时候,我们不需要那么多,我只要满足条件的第一个就可以,所以,很自然的就有find函数,方法差不多,直接忽略了
还有要注意的是找兄弟,和找父节点(后者用的比较少)
pc= soup.body.p # 找到他的兄弟节点,用这个 属于迭代方式
for item in pc.next_siblings:
print item.__str__().replace("\n","") #找到他的下一个兄弟
print pc.find_next_sibling() # 找父节点
print pc.parent
下面来一个终极大招,现在要找一个既有class属性又有id属性的怎么搞?
def has_class_with_id(html):
return html.has_attr('class') and html.has_attr('id') result = soup.find_all(is_right)
for item in result:
print result
再来个难点的,我需要找到class=hello并且id=1的怎么搞?
def is_right(html):
print html
print html.has_attr('class')
print html.has_attr('id')
if html.has_attr('class'):
print html['class'][0]
if html.has_attr('id'):
print html['id']
print ""
return html.has_attr('class') and html.has_attr('id') and html['class'][0]=="hello" and html['id']=="1" 注意下,class可能含多个,所以它也是一个集合
python BeautifulSoup的更多相关文章
- 【转】Python BeautifulSoup 中文乱码解决方法
这篇文章主要介绍了Python BeautifulSoup中文乱码问题的2种解决方法,需要的朋友可以参考下 解决方法一: 使用python的BeautifulSoup来抓取网页然后输出网页标题,但是输 ...
- Python -- BeautifulSoup的学习使用
BeautifulSoup4.3 的使用 下载和安装 # 下载 http://www.crummy.com/software/BeautifulSoup/bs4/download/ # 解压后 使用r ...
- Python beautifulsoup模块
BeautifulSoup中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ BeautifulSoup下载:http://w ...
- Python - BeautifulSoup 安装
BeautifulSoup 3.x 1. 下载 BeautifulSoup. [huey@huey-K42JE python]$ wget http://www.crummy.com/software ...
- Python BeautifulSoup中文乱码问题的2种解决方法
解决方法一: 使用python的BeautifulSoup来抓取网页然后输出网页标题,但是输出的总是乱码,找了好久找到解决办法,下面分享给大家首先是代码 from bs4 import Beautif ...
- python BeautifulSoup库的基本使用
Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以 ...
- python BeautifulSoup的简单使用
官网:https://www.crummy.com/software/BeautifulSoup/bs4/doc/ 参考:https://www.cnblogs.com/yupeng/p/336203 ...
- python BeautifulSoup 介绍--安装
Python中,专门用于HTML/XML解析的库: 特点是: 即使是有bug,有问题的html代码,也可以解析. BeautifulSoup主要有两个版本 BeautifulSoup 3 之前的,比较 ...
- python BeautifulSoup库用法总结
1. Beautiful Soup 简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.pyt ...
- python beautifulsoup/xpath/re详解
自己在看python处理数据的方法,发现一篇介绍比较详细的文章 转自:http://blog.csdn.net/lingojames/article/details/72835972 20170531 ...
随机推荐
- Flask学习-Flask app启动过程
因为0.1版本整体代码大概只有350行,比较简单.所以本篇文章会以Flask 0.1版本源码为基础进行剖析Flask应用的启动过程. Flask参考资料flask,官网有一个最简单app: from ...
- Azure 基础:自定义 Table storage 查询条件
本文是在 <Azure 基础:Table storage> 一文的基础上介绍如何自定义 Azure Table storage 的查询过滤条件.如果您还不太清楚 Azure Table s ...
- 关于ueditor一些使用记录
1.使用的引用配置顺序 <script src="utf8-net/ueditor.config.js"></script> <script src= ...
- 揭秘memset与sizeof的结合使用方法
memset与sizeof为什么经常结合起来用呢? 一.memset介绍 memset函数是C++中的一个函数,它将从给定地址开始,逐个字节刷内存,初始化它们为给定的参数. 基本用法: void * ...
- bugkuct部分writeup 持续更新
6307 校赛被打击到自闭,决心好好学习. web部分题目. 1.web2 地址 http://123.206.87.240:8002/web2/ 既然是第一个题我们应该采取查看源码的方式进行,右键之 ...
- @Param注解的用法解析
实例一 @Param注解单一属性 dao层示例 Public User selectUser(@param(“userName”) String name,@param(“userpassword”) ...
- Scrum Meeting NO.5
Scrum Meeting No.5 1.会议内容 暂时料理完了编译,可以写软工了.说多了都是泪T_T 2.任务清单 徐越 序号 近期的任务 进行中 已完成 1 修改url名.参数 √ 2 学习Jso ...
- week2--操作系统是如何工作的
潘恒 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.一个简单的时间 ...
- Linux内核分析——计算机是如何工作的
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 ( ...
- C++:钻石继承与虚继承
QUESTION:什么是钻石继承? ANSWER:假设我们已经有了两个类Father1和Father2,他们都是类GrandFather的子类.现在又有一个新类Son,这个新类通过多继承机制对类Fat ...