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

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)
(0)

相关推荐

  • Python利用BeautifulSoup解析Html的方法示例

    介绍 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序. Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码.你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了.然后,你仅仅需要说明一下原始编码方式就可以了. Beautiful

  • python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)

    一.利用HTMLParser进行网页解析 具体HTMLParser官方文档可参考http://docs.python.org/library/htmlparser.html#HTMLParser.HTMLParser 1.从一个简单的解析例子开始 例1: test1.html文件内容如下: 复制代码 代码如下: <html> <head> <title> XHTML 与 HTML 4.01 标准没有太多的不同</title> </head> &l

  • python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)

    前言 python爬虫系列文章的第3篇介绍了网络请求库神器 Requests ,请求把数据返回来之后就要提取目标数据,不同的网站返回的内容通常有多种不同的格式,一种是 json 格式,这类数据对开发者来说最友好.另一种 XML 格式的,还有一种最常见格式的是 HTML 文档,今天就来讲讲如何从 HTML 中提取出感兴趣的数据 自己写个 HTML 解析器来解析吗?还是用正则表达式?这些都不是最好的办法,好在,Python 社区在这方便早就有了很成熟的方案,BeautifulSoup 就是这一类问题

  • python 解析html之BeautifulSoup

    复制代码 代码如下: # coding=utf-8 from BeautifulSoup import BeautifulSoup, Tag, NavigableString from SentenceSpliter import SentenceSpliter from os.path import basename,dirname,isdir,isfile from os import makedirs from shutil import copyfile import io import

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

    BeautifulSoup是Python的一个第三方库,可用于帮助解析html/XML等内容,以抓取特定的网页信息.目前最新的是v4版本,这里主要总结一下我使用的v3版本解析html的一些常用方法. 准备 1.Beautiful Soup安装 为了能够对页面中的内容进行解析,本文使用Beautiful Soup.当然,本文的例子需求较简单,完全可以使用分析字符串的方式. 执行 sudo easy_install beautifulsoup4 即可安装. 2.requests模块的安装 reque

  • python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)

    [python爬虫基础入门]系列是对python爬虫的一个入门练习实践,旨在用最浅显易懂的语言,总结最明了,最适合自己的方法,本人一直坚信,总结才会使人提高 1. BeautifulSoup库简介 BeautifulSoup库在python中被美其名为"靓汤",它和和 lxml 一样也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,若在没用安装此库的情况下

  • python爬虫lxml库解析xpath网页过程示例

    目录 前言 (一)xpath是什么 (二)xpath的基本语法 路径查询. (三) lxml库 (四)lxml库的使用 导入lxml.etree (五)实例演示 前言 在我们抓取网页内容的时候,通常是抓取一整个页面的内容,而我们仅仅只是需要该网页中的部分内容,那该如何去提取呢?本章就带你学习xpath插件的使用.去对网页的内容进行提取. (一)xpath是什么 xpath是一门在XML文档中查找信息的语言,xpath可用来在XML 文档中对元素和属性进行遍历,主流的浏览器都支持xpath,因为h

  • Python使用JSON库解析JSON数据的方法

    目录 1 如何在网页中获取 JSON 数据? 2 Python 内置的 JSON 库 1 如何在网页中获取 JSON 数据? 打开一个具有动态渲染的网页,按 F12 打开浏览器开发工具,点击“网络”,再刷新一下网页,观察是否有新的数据包. 发现有 js 后缀的文件,这就是我们想要的 json 数据了. 2 Python 内置的 JSON 库 内置的 json 库的函数: dumps:用于将 Python 的数据类型转化为 json 字符串. loads:将 json 字符串转化为 Python

  • python用BeautifulSoup库简单爬虫实例分析

    会用到的功能的简单介绍 1.from bs4 import BeautifulSoup #导入库 2.请求头herders headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36','referer':"www.mmjpg.com" } all_url = 'http://ww

  • python BeautifulSoup库的安装与使用

    1.BeautifulSoup简介 BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器. Beautiful Soup自动将输入文档转换为Unicode编码,

  • python爬虫请求库httpx和parsel解析库的使用测评

    Python网络爬虫领域两个最新的比较火的工具莫过于httpx和parsel了.httpx号称下一代的新一代的网络请求库,不仅支持requests库的所有操作,还能发送异步请求,为编写异步爬虫提供了便利.parsel最初集成在著名Python爬虫框架Scrapy中,后独立出来成立一个单独的模块,支持XPath选择器, CSS选择器和正则表达式等多种解析提取方式, 据说相比于BeautifulSoup,parsel的解析效率更高. 今天我们就以爬取链家网上的二手房在售房产信息为例,来测评下http

  • Python实战快速上手BeautifulSoup库爬取专栏标题和地址

    目录 安装 解析标签 解析属性 根据class值解析 根据ID解析 多层筛选 提取a标签中的网址 实战-获取博客专栏 标题+网址 BeautifulSoup库快速上手 安装 pip install beautifulsoup4 # 上面的安装失败使用下面的 使用镜像 pip install beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple 使用PyCharm的命令行 解析标签 from bs4 import BeautifulS

  • Python爬取求职网requests库和BeautifulSoup库使用详解

    目录 一.requests库 1.requests简介 2.安装requests库 3.使用requests获取网页数据 我们先导入模块 4.总结requests的一些方法 二.BeautifulSoup库 1.BeautifulSoup简介 2.安装BeautifulSoup库 3.使用BeautifulSoup解析并提取获取的数据 4.BeautifulSoup提取数据的方法 一.requests库 1.requests简介 requests库就是一个发起请求的第三方库,requests允许

  • Python使用Beautiful Soup(BS4)库解析HTML和XML

    目录 一.Beautiful Soup概述: 安装: 二.BeautifulSoup4简单使用 三.BeautifulSoup4四大对象种类 1.Tag:标签 2.NavigableString:标签内部的文字 3.BeautifulSoup:文档的内容 4.Comment:注释 四.遍历文档树所用属性 五.搜索文档树 1.find_all():过滤器 (1)name参数: (2)kwargs参数: (3)attrs参数: (4)text参数: (5)limit参数: 2.find() 六.CS

随机推荐