python BeautifulSoup使用方法详解


Posted in Python onNovember 21, 2013

直接看例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="https://3water.com" class="sister" id="link1">Elsie</a>,
<a href="https://3water.com" class="sister" id="link2">Lacie</a> and
<a href="https://3water.com" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc)
print soup.title
print soup.title.name
print soup.title.string
print soup.p
print soup.a
print soup.find_all('a')
print soup.find(id='link3')
print soup.get_text()

结果为:

<title>The Dormouse's story</title>
title
The Dormouse's story
<p class="title"><b>The Dormouse's story</b></p>
<a class="sister" href="https://3water.com" id="link1">Elsie</a>
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
<a class="sister" href="https://3water.com" id="link3">Tillie</a>
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
...

可以看出:soup 就是BeautifulSoup处理格式化后的字符串,soup.title 得到的是title标签,soup.p  得到的是文档中的第一个p标签,要想得到所有标签,得用find_all
函数。find_all 函数返回的是一个序列,可以对它进行循环,依次得到想到的东西.
get_text() 是返回文本,这个对每一个BeautifulSoup处理后的对象得到的标签都是生效的。你可以试试 print soup.p.get_text()
其实是可以获得标签的其他属性的,比如我要获得a标签的href属性的值,可以使用 print soup.a['href'],类似的其他属性,比如class也是可以这么得到的(soup.a['class'])。
特别的,一些特殊的标签,比如head标签,是可以通过soup.head 得到,其实前面也已经说了。
如何获得标签的内容数组?使用contents 属性就可以 比如使用 print soup.head.contents,就获得了head下的所有子孩子,以列表的形式返回结果,
可以使用 [num]  的形式获得 ,获得标签,使用.name 就可以。
获取标签的孩子,也可以使用children,但是不能print soup.head.children 没有返回列表,返回的是 <listiterator object at 0x108e6d150>,
不过使用list可以将其转化为列表。当然可以使用for 语句遍历里面的孩子。
关于string属性,如果超过一个标签的话,那么就会返回None,否则就返回具体的字符串print soup.title.string 就返回了 The Dormouse's story
超过一个标签的话,可以试用strings
向上查找可以用parent函数,如果查找所有的,那么可以使用parents函数
查找下一个兄弟使用next_sibling,查找上一个兄弟节点使用previous_sibling,如果是查找所有的,那么在对应的函数后面加s就可以

如何遍历树?

使用find_all 函数

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

举例说明:

print soup.find_all('title')
print soup.find_all('p','title')
print soup.find_all('a')
print soup.find_all(id="link2")
print soup.find_all(id=True)

返回值为:

[<title>The Dormouse's story</title>]
[<p class="title"><b>The Dormouse's story</b></p>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[<a class="sister" href="https://3water.com" id="link2">Lacie</a>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]

通过css查找,直接上例子:

print soup.find_all("a", class_="sister")
print soup.select("p.title")

通过属性进行查找

print soup.find_all("a", attrs={"class": "sister"})

通过文本进行查找

print soup.find_all(text="Elsie")
print soup.find_all(text=["Tillie", "Elsie", "Lacie"])

限制结果个数

print soup.find_all("a", limit=2)

结果为:

[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[<p class="title"><b>The Dormouse's story</b></p>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[u'Elsie']
[u'Elsie', u'Lacie', u'Tillie']
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>]

总之,通过这些函数可以查找到想要的东西。

Python 相关文章推荐
python cookielib 登录人人网的实现代码
Dec 19 Python
python中的全局变量用法分析
Jun 09 Python
Python3访问并下载网页内容的方法
Jul 28 Python
利用Python中unittest实现简单的单元测试实例详解
Jan 09 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
python的re正则表达式实例代码
Jan 24 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
Python如何使用OS模块调用cmd
Feb 27 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
Python一些基本的图像操作和处理总结
Jun 23 Python
python装饰器使用方法实例
Nov 21 #Python
tornado框架blog模块分析与使用
Nov 21 #Python
python迭代器的使用方法实例
Nov 21 #Python
python生成器的使用方法
Nov 21 #Python
python单链表实现代码实例
Nov 21 #Python
python双向链表实现实例代码
Nov 21 #Python
python二叉树遍历的实现方法
Nov 21 #Python
You might like
php 输出双引号&quot;与单引号'的方法
2010/05/09 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
Python设计实现的计算器功能完整实例
2017/08/18 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
django中forms组件的使用与注意
2019/07/08 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
Python3 翻转二叉树的实现
2019/09/30 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
单位门卫岗位职责
2013/12/20 职场文书
剪枝的学问教学反思
2014/02/07 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
2014年领班工作总结
2014/11/25 职场文书
自主招生自荐信格式
2015/03/04 职场文书
2015年共青团工作总结
2015/05/15 职场文书
公司开业致辞
2015/07/29 职场文书
节约用水广告语60条
2019/11/14 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
你知道Java Spring的两种事务吗
2022/03/16 Java/Android