Python使用BeautifulSoup库解析HTML基本使用教程


Posted in Python onMarch 31, 2016

 BeautifulSoup是Python的一个第三方库,可用于帮助解析html/XML等内容,以抓取特定的网页信息。目前最新的是v4版本,这里主要总结一下我使用的v3版本解析html的一些常用方法。

准备

1.Beautiful Soup安装

为了能够对页面中的内容进行解析,本文使用Beautiful Soup。当然,本文的例子需求较简单,完全可以使用分析字符串的方式。

执行

sudo easy_install beautifulsoup4

即可安装。

2.requests模块的安装

requests模块用于加载要请求的web页面。

在python的命令行中输入import requests,报错说明requests模块没有安装。

我这里打算采用easy_install的在线安装方式安装,发现系统中并不存在easy_install命令,输入sudo apt-get install python-setuptools来安装easy_install工具。

执行sudo easy_install requests安装requests模块。

基础

1.初始化
   导入模块

#!/usr/bin/env python
from BeautifulSoup import BeautifulSoup    #process html
#from BeautifulSoup import BeautifulStoneSoup #process xml
#import BeautifulSoup             #all

    创建对象:str初始化,常用urllib2或browser返回的html初始化BeautifulSoup对象。

doc = ['hello',
    '
This is paragraph one of ptyhonclub.org.',
    '
This is paragraph two of pythonclub.org.',
    '']
soup = BeautifulSoup(''.join(doc))

    指定编码:当html为其他类型编码(非utf-8和asc ii),比如GB2312的话,则需要指定相应的字符编码,BeautifulSoup才能正确解析。

htmlCharset = "GB2312"
soup = BeautifulSoup(respHtml, fromEncoding=htmlCharset)

2.获取tag内容
   寻找感兴趣的tag块内容,返回对应tag块的剖析树

head = soup.find('head')
#head = soup.head
#head = soup.contents[0].contents[0]
print head

    返回内容:hello
   说明一下,contents属性是一个列表,里面保存了该剖析树的直接儿子。

html = soup.contents[0]    # <html> ... </html>
head = html.contents[0]    # <head> ... </head>
body = html.contents[1]    # <body> ... </body>

3.获取关系节点
   使用parent获取父节点

body = soup.body
html = body.parent       # html是body的父亲

    使用nextSibling, previousSibling获取前后兄弟

head = body.previousSibling  # head和body在同一层,是body的前一个兄弟
p1 = body.contents[0]     # p1, p2都是body的儿子,我们用contents[0]取得p1
p2 = p1.nextSibling      # p2与p1在同一层,是p1的后一个兄弟, 当然body.content[1]也可得到

    contents[]的灵活运用也可以寻找关系节点,寻找祖先或者子孙可以采用findParent(s), findNextSibling(s), findPreviousSibling(s)

4.find/findAll用法详解
   函数原型:find(name=None, attrs={}, recursive=True, text=None, **kwargs),findAll会返回所有符合要求的结果,并以list返回。
   tag搜索

find(tagname)                 # 直接搜索名为tagname的tag 如:find('head')
find(list)                   # 搜索在list中的tag,如: find(['head', 'body'])
find(dict)                   # 搜索在dict中的tag,如:find({'head':True, 'body':True})
find(re.compile(''))              # 搜索符合正则的tag, 如:find(re.compile('^p')) 搜索以p开头的tag
find(lambda)            # 搜索函数返回结果为true的tag, 如:find(lambda name: if len(name) == 1) 搜索长度为1的tag
find(True)                   # 搜索所有tag

   attrs搜索

find(id='xxx')                 # 寻找id属性为xxx的
find(attrs={id=re.compile('xxx'), algin='xxx'}) # 寻找id属性符合正则且algin属性为xxx的
find(attrs={id=True, algin=None})        # 寻找有id属性但是没有algin属性的


resp1 = soup.findAll('a', attrs = {'href': match1})
resp2 = soup.findAll('h1', attrs = {'class': match2})
resp3 = soup.findAll('img', attrs = {'id': match3})

text搜索
文字的搜索会导致其他搜索给的值如:tag, attrs都失效。方法与搜索tag一致

print p1.text
# u'This is paragraphone.'
print p2.text
# u'This is paragraphtwo.'
# 注意:1,每个tag的text包括了它以及它子孙的text。2,所有text已经被自动转为unicode,如果需要,可以自行转码encode(xxx)

recursive和limit属性
recursive=False表示只搜索直接儿子,否则搜索整个子树,默认为True。当使用findAll或者类似返回list的方法时,limit属性用于限制返回的数量,如findAll('p', limit=2): 返回首先找到的两个tag。

实例
本文以博客的文档列表页面为例,利用python对页面中的文章名进行提取。

文章列表页中的文章列表部分的url如下:

<ul class="listing">
  <li class="listing-item"><span class="date">2014-12-03</span><a href="/post/linux_funtion_advance_feature" title="Linux函数高级特性" >Linux函数高级特性</a>
  </li>
  <li class="listing-item"><span class="date">2014-12-02</span><a href="/post/cgdb" title="cgdb的使用" >cgdb的使用</a>
  </li>
...
</ul>

代码:

#!/usr/bin/env python                                                                              
# -*- coding: utf-8 -*-

' a http parse test programe '

__author__ = 'kuring lv'


import requests
import bs4

archives_url = "http://kuring.me/archive"

def start_parse(url) :
  print "开始获取(%s)内容" % url
  response = requests.get(url)
  print "获取网页内容完毕"

  soup = bs4.BeautifulSoup(response.content.decode("utf-8"))
  #soup = bs4.BeautifulSoup(response.text);

  # 为了防止漏掉调用close方法,这里使用了with语句
  # 写入到文件中的编码为utf-8
  with open('archives.txt', 'w') as f :
    for archive in soup.select("li.listing-item a") :
      f.write(archive.get_text().encode('utf-8') + "\n")
      print archive.get_text().encode('utf-8')

# 当命令行运行该模块时,__name__等于'__main__'
# 其他模块导入该模块时,__name__等于'parse_html'
if __name__ == '__main__' :
  start_parse(archives_url)
Python 相关文章推荐
Python中单、双下划线的区别总结
Dec 01 Python
Numpy数组的保存与读取方法
Apr 04 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
Jan 23 Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
python excel转换csv代码实例
Aug 26 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 Python
python3实现简单飞机大战
Nov 29 Python
Python移位密码、仿射变换解密实例代码
Jun 27 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 #Python
Python语言实现获取主机名根据端口杀死进程
Mar 31 #Python
Linux中Python 环境软件包安装步骤
Mar 31 #Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 #Python
横向对比分析Python解析XML的四种方式
Mar 30 #Python
python简单实现刷新智联简历
Mar 30 #Python
详解Python迭代和迭代器
Mar 28 #Python
You might like
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
小程序实现留言板
2018/11/02 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
食堂员工工作职责
2013/12/18 职场文书
学校对教师的评语
2014/04/28 职场文书
倡议书的写法
2014/08/30 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
罚站检讨书
2015/01/29 职场文书
关于运动会的广播稿
2015/08/19 职场文书
小学副班长竞选稿
2015/11/21 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
导游词之任弼时故居
2020/01/07 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫