Posted on

Beautiful Soup 中文文档

Beautiful Soup 中文文档原文 by Leonard Richardson (leonardr@segfault.org)
翻译 by Richie Yan (richieyan@gmail.com)
###如果有些翻译的不准确或者难以理解,直接看例子吧。###

英文原文点这里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 HTMLfrom BeautifulSoup import BeautifulStoneSoup # For processing XMLimport BeautifulSoup # To get everything
下面的代码是Beautiful Soup基本功能的示范。你可以复制粘贴到你的python文件中,自己运行看看。
from BeautifulSoup import BeautifulSoupimport 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.titletitleTag
#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 urllib2from 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标签有一个自然的内嵌顺序。例如,标签内为
标签,而不会相反。 *

Leave a Reply

Your email address will not be published.