BeautifulSoup笔记整理[归档]
时间:2010-06-22 来源:hkebao
BeautifulSoup笔记整理[归档]
时间:2010-6-22
整理一下这个开源框架。依据示例与自己的理解整理。
1. 代码片段
from BeautifulSoup import BeautifulSoup
doc = ['<html><head><title>PythonClub.org</title></head>',
'<body><p id="firstpara" align="center">This is paragraph <b>one</b> of ptyhonclub.org.',
'<p id="secondpara" align="blah">This is paragraph <b>two</b> of pythonclub.org.',
'</html>']
soup = BeautifulSoup(''.join(doc))
#依据HTML标签查找
print soup.html.head.title
心得:
1. 依据 . 号可以利用DOM树把元素提取出来。这里面的soup.html.head.title 能够得到一个标签<title> PythonClub.org</title> 这个HTML标签。
2. 元素的string属性值是获取当前HTML标签体内的元素字符串。如:
print soup.html.head.title.string 返回的是PythonClub.org。
2. 代码片段:
import re
from BeautifulSoup import BeautifulSoup
doc = ['<html><head><title>PythonClub.org</title></head>',
'<body><p id="firstpara" align="center">This is paragraph <b>one</b> of ptyhonclub.org.',
'<p id="secondpara" align="blah">This is paragraph <b>two</b> of pythonclub.org.',
'</html>']
soup = BeautifulSoup(''.join(doc))
#依据HTML标签查找
print soup.findAll(text=re.compile("para"))
说明一点:这里面我们用的findAll。这个方法是非常有用的。在我们对一个HTML页面进行搜索元素定位的时候就显得非常有用了。它能够依据元素标签的特性或元素内的内容特性定位要查找的内容。
像这个就表示说标签内的元素内容包括了para的。
返回:[u'This is paragraph ', u'This is paragraph ']
PS:记得在上一个项目中我们经常会用到这个东西。主要是在寻找元素标签的时候准确定位
示例:#依据HTML标签查找
print soup.findAll('p',id="firstpara")
这个表示的是什么呢?表示的是<p id=”firstpara” >这个标签(包含了这个标签)的全部内容。
打印:[<p id="firstpara" align="center">This is paragraph <b>one</b> of ptyhonclub.org.</p>]
含有p标签在内的全部的标签在内。
问题:如果我想获取此标签体内的进一步标签的话要如何处理?
例如:
1. 我想获取当前的id值的话可以这样写
print soup.findAll('p',id="firstpara")[0]['id']
2. 我用print soup.findAll('p',id="firstpara")
能够返回[<p id="firstpara" align="center">This is paragraph <b>one</b> of ptyhonclub.org.</p>]
那如果我想获取<b>one</b>里面的one怎么办呢?
print soup.findAll('p',id="firstpara")[0].b.string
打印:one
PS:[0] 表示返回的一个序列值,我们只提取第一个。然后再使用HTML的方式进行提取。然后HTML里面的string表示的是元素值。
3. 如果print soup.findAll('p',id="firstpara")
[<p id="firstpara" align="center">This is paragraph <b>one</b> of ptyhonclub.org.</p>]
如果我想打印This is paragraph 要怎么办?
print soup.findAll('p',id="firstpara")[0].contents[0]
说明:这里面这个contents非常有用。我个人感觉 这个东西是什么呢?这个东西其实是表示在一段标签体内,元素与标签这样的一个划分。如
This is paragraph <b>one</b> of ptyhonclub.org.
print soup.findAll('p',id="firstpara")[0].contents[0]
: This is paragraph
print soup.findAll('p',id="firstpara")[0].contents[1]
: <b>one</b>
以下两个表达式效果是一样的
print soup.findAll('p',id="firstpara")[0].contents[1].string
print soup.findAll('p',id="firstpara")[0].b.string
print soup.findAll('p',id="firstpara")[0].b.a["href"]
能够准确定位到标签的属性。有了这些属性就能够查找到这个属性值。
介绍一下它的编码流程
BeautifulSoup按下面的顺序检测编码:
- 创建Soup对象时传递的 fromEncoding 参数;(默认我们是UTF8)
- XML/HTML文件自己定义的编码;
- 文件开始几个字节所表示的编码特征,此时能判断的编码只可能是以下编码之一:UTF-*,EBCDIC,和ASCII。
- 如果你安装了chardet,BeautifulSoup会用chardet检测文件编码。
- UTF-8
- Windows-1252