Beautiful Soup 中文文档

原文 by Leonard Richardson ([email protected]

翻译 by  Richie Yan  ([email protected]
###如果有些翻译的不准确或者难以理解,直接看例子吧。### 


英文原文点 这里

Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。它可以大大节省你的编程时间。 对于Ruby,使用Rubyful Soup。

这个文档说明了Beautiful Soup 3.0主要的功能特性,并附有例子。 从中你可以知道这个库有哪些好处,它是怎样工作的, 怎样让它帮做你想做的事以及你该怎样做当它做的和你期待不一样。

目录

  • 快速开始
  • 剖析文档
    • 剖析 HTML
    • 剖析 XML
    • 如果它不工作
  • 使用Unicode的Beautiful Soup, Dammit
  • 输出文档
  • 剖析树
    • Tags的属性
  • Navigating 剖析树
    • parent
    • contents
    • string
    • nextSibling and previousSibling
    • next and previous
    • 遍历Tag
    • 使用标签名作为成员
  • Searching 剖析树
    • The basic find method: findAll(name, attrs, recursive, text, limit, **kwargs)
      • 使用CSS类查找
      • 像 findall一样调用tag
    • find(name, attrs, recursive, text, **kwargs)
    • first哪里去了?
  • Searching 剖析树内部
    • findNextSiblings(name, attrs, text, limit, **kwargs) and findNextSibling(name, attrs, text, **kwargs)
    • findPreviousSiblings(name, attrs, text, limit, **kwargs) and findPreviousSibling(name, attrs, text, **kwargs)
    • findAllNext(name, attrs, text, limit, **kwargs) and findNext(name, attrs, text, **kwargs)
    • findAllPrevious(name, attrs, text, limit, **kwargs) and findPrevious(name, attrs, text, **kwargs)
  • Modifying 剖析树
    • 改变属性值
    • 删除元素
    • 替换元素
    • 添加新元素
  • 常见问题(Troubleshooting)
    • 为什么Beautiful Soup不能打印我的no-ASCII字符?
    • Beautiful Soup 弄丢了我给的数据!为什么?为什么?????
    • Beautiful Soup 太慢了!
  • 高级主题
    • 产生器(Generators)
    • 其他的内部剖析器
    • 定制剖析器(Parser)
    • 实体转换
    • 使用正则式处理糟糕的数据
    • 玩玩SoupStrainers
    • 通过剖析部分文档来提升效率
    • 使用extract改进内存使用
  • 其它
    • 使用Beautiful Soup的其他应用
    • 类似的库
  • 小结

快速开始

从这里获得 Beautiful Soup。 变更日志 描述了3.0 版本与之前版本的不同。

在程序中中导入 Beautiful Soup库:

from BeautifulSoup import BeautifulSoup          # For processing HTML
from BeautifulSoup import BeautifulStoneSoup     # For processing XML
import BeautifulSoup                             # To get everything

下面的代码是Beautiful Soup基本功能的示范。你可以复制粘贴到你的python文件中,自己运行看看。

from BeautifulSoup import BeautifulSoup
import re

doc = ['Page title',
       '

This is paragraph one.', '

This is paragraph two.', ''] soup = BeautifulSoup(''.join(doc)) print soup.prettify() # # # # Page title # # # #

# This is paragraph # # one # # . #

#

# This is paragraph # # two # # . #

# #

navigate soup的一些方法:

soup.contents[0].name
# u'html'

soup.contents[0].contents[0].name
# u'head'

head = soup.contents[0].contents[0]
head.parent.name
# u'html'

head.next
# Page title

head.nextSibling.name
# u'body'

head.nextSibling.contents[0]
# 

This is paragraph one.

head.nextSibling.contents[0].nextSibling #

This is paragraph two.

下面是一些方法搜索soup,获得特定标签或有着特定属性的标签:

titleTag = soup.html.head.title
titleTag
# Page title

titleTag.string
# u'Page title'

len(soup('p'))
# 2

soup.findAll('p', align="center")
# [

This is paragraph one.

] soup.find('p', align="center") #

This is paragraph one.

soup('p', align="center")[0]['id'] # u'firstpara' soup.find('p', align=re.compile('^b.*'))['id'] # u'secondpara' soup.find('p').b.string # u'one' soup('p')[1].b.string # u'two'

修改soup也很简单:

titleTag['id'] = 'theTitle'
titleTag.contents[0].replaceWith("New title")
soup.html.head
# New title

soup.p.extract()
soup.prettify()
# 
#  
#   
#    New title
#   
#  
#  
#   

# This is paragraph # # two # # . #

# # soup.p.replaceWith(soup.b) # # # # New title # # # # # two # # # soup.body.insert(0, "This page used to have ") soup.body.insert(2, " <p> tags!") soup.body # This page used to have two <p> tags!

一个实际例子,用于抓取 ICC Commercial Crime Services weekly piracy report页面, 使用Beautiful Soup剖析并获得发生的盗版事件:

import urllib2
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen("http://www.icc-ccs.org/prc/piracyreport.php")
soup = BeautifulSoup(page)
for incident in soup('td', width="90%"):
    where, linebreak, what = incident.contents[:3]
    print where.strip()
    print what.strip()
    print

剖析文档

Beautiful Soup使用XML或HTML文档以字符串的方式(或类文件对象)构造。 它剖析文档并在内存中创建通讯的数据结构

如果你的文档格式是非常标准的,解析出来的数据结构正如你的原始文档。但是 如果你的文档有问题,Beautiful Soup会使用heuristics修复可能的结构问题。

剖析 HTML

使用 BeautifulSoup 类剖析HTML文档。 BeautifulSoup会得出以下一些信息:

  • 有些标签可以内嵌 (
    ) ,有些不行 (

    ).

  • table和list标签有一个自然的内嵌顺序。例如, 标签内为 标签,而不会相反。

你可能感兴趣的:(python)