您的位置:首页 > 编程语言 > Python开发

python 使用 BeautifulSoup 解析html

2015-12-15 17:48 756 查看
下载地址:http://www.crummy.com/software/BeautifulSoup/bs4/download/4.3/beautifulsoup4-4.3.2.tar.gz

说明:这个版本使用python 2.7比较好。

install: 解压缩,然后运行python setup.py install

linux系统还可以:sudo apt-get install Python-bs4

官方文档:
http://www.crummy.com/software/BeautifulSoup/bs4/doc/
(也可以使用 pyQuery)

输出文档

with open('test.html', 'w') as f:
f.write(soup.prettify().encode('utf-8'))


当你调用
__str__
,
prettify
或者
renderContents
时, 你可以指定输出的编码。默认的编码(
str
使用的)是UTF-8。 下面是处理ISO-8851-1的串并以不同的编码输出同样的串的例子。 soup.__str__("ISO-8859-1")

四大对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

Tag: 对于 Tag,它有两个重要的属性,是 name 和 attrs

NavigableString: 获取标签内部的文字

BeautifulSoup:you can treat it as a Tag object

Comment:获取注释 <!-- comment -->

Tag:

print type(soup.a)
#<class 'bs4.element.Tag'>


print soup.p.attrs
#{'class': ['title'], 'name': 'dromouse'}


css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
# ["body", "strikeout"]


NavigableString:

print soup.p.string
#The Dormouse's story


足够有用:

soup.title
# <title>The Dormouse's story</title>

soup.title.name
# u'title'

soup.title.string
# u'The Dormouse's story'

soup.title.parent.name
# u'head'

soup.p
# <p class="title"><b>The Dormouse's story</b></p>

soup.p['class']
# u'title'

soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

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

import re
soup.find(string=re.compile("sisters"))

soup.find(id="link3")
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>


head_tag.contents
[<title>The Dormouse's story</title>]

head_tag.children
[<title>The Dormouse's story</title>]

title_tag.parent
# <head><title>The Dormouse's story</title></head>

sibling_soup.b.next_sibling
# <c>text2</c>

sibling_soup.c.previous_sibling
# <b>text1</b>


find_all == findAll

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

我的程序:

def parse_html(text):
soup = BeautifulSoup(text, from_encoding="UTF-8")
# 找出id="historyTable"的table, 找到它内部的第一个table,获取所有的 tr
target = soup.find(id="historyTable").find('table').findAll('tr')
results = []
rec = []
for tr in target[1:]: # ignore th
tds = tr.findAll('td') # 获取所有的 td
build_no = str(tds[1].span.string.strip()) # 找出第二个td的span节点,取出它的text内容
patch = str(tds[0].a.string) # 第一个td 的 a 节点的text
status_node = tds[2].find('a')
status = str(status_node.find('span').string)
status_link = '%s/%s'%(TEAMCITY_HOME, status_node.attrs['href']) # 属性
started = str(tds[5].string.replace(u'\xa0', ' ')) # 去掉无法解析的字符

print '-'*10
print '%s\t'%patch,
print '%s\t'%build_no,
print '%s\t'%status,
print '%s\t'%started
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: