6.1 网页解析器简介
- 网页解析器:从网页中提取有价值数据的工具(对于搜素引擎来说,它可以提取出网页中所有的URL,但是对于定向爬虫来说,除了提取出待爬取网页中所有的URL之外,同时也会提取出有价值的数据)。
- 网页解析器会以下载好的Html 网页字符串作为输入,然后提取出游价值的数据和新的待爬取的URL列表
- Python 有几种网页解析器?
- 1.正则表达式:
会将整个网页文档当成一个字符串,使用模糊匹配的方式来提取出有价值的数据,虽然直观,但是如果文档比较复杂的话,这种方式非常的麻烦。 - 2.使用python自带的html.parser模块来解析网页
- 3.使用Beautiful Soup第三方插件来解析网页(可以使用html.parser,lxml作为解析器)
- 4.使用lxml第三方插件解析html网页或xmL网页
- 结构化的解析
- 将整个文档下载成一个DOM树,以树的形式进行上下级的延续和遍历,DOM树会将整个html网页当成一个Document对象。
- DOM的树形结构根据上下级关系,可以很方便的定位到各个元素,然后访问这个元素的属性或者文本
6.2 Beautiful Soup模块的介绍和安装
- Beautiful Soup
——Python 第三方库,用于从HTMl或XML中提取数据
——官网:http://www.crummy.com/software/BeautifulSoup/ - 安装并测试beautifulsoup4
——安装:pip install beautifulsoup4
——测试:import bs4
再次运行测试程序
控制台输出如下,说明已经成功安装bs4模块
123D : \ Python27 \ python . exe G : / Web - Crawler / test_beautifulsoup4 . py& lt ; module 'bs4' from 'D:\Python27\lib\site-packages\bs4\__init__.pyc' & gt ;Process finished with exit code 0
6.3 BeautifulSoup的语法
- 根据Html 网页创建BeautifulSoup对象,也就是创建一棵DOM树,然后根据DOM树进行各种节点的搜索(find_all方法可以搜索出所有满足要求的节点,find方法只会搜索出第一个满足要求的节点,两个方法的参数是一样的),得到了一个节点之后,我们就可以访问节点的名称,节点的属性,节点的文字;相应的,在搜索节点的时候,我们也可以按照及节点的名称进行搜索,按照节点的属性进行搜索,或者说按照节点的文字进行搜索。我们将节点的内容分成名称,属性,文字。
6.4 BeautifulSoup的实例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# -*- coding: utf-8 -*-
# file description : test beautiful soup4 part
# author : zhmi
# mail : *******@***.com
from
__future__
import
unicode_literals
from
bs4
import
BeautifulSoup
import
re
# 根据HTML网页字符串创建BeautifulSoup对象
html_doc
=
""
"
'<html><head><title>Page title</title></head>',
'<a href = "
http
:
//example.com/lacie" class="sister" id="link2">Lacie</a>',
'<a href = "http://example.com/title" class="sister" id="link3">title</a>'
,
'<body><p id="firstpara" align="center">This is paragraph <b>one</b>.'
,
'<p id="secondpara" align="blah">This is paragraph <b>two</b>.'
,
'</html>'
""
"
soup = BeautifulSoup(
html_doc, # HTML文档字符串
"
html
.
parser
", # HTML解析器
from_encoding = 'utf-8' # HTML文档的编码
)
print '获取所有的链接'
links = soup.find_all('a')
for link in links:
print link.name,link['href'],link.get_text()
print "获取
lacie的链接
"
link_node = soup.find('a',href='http://example.com/lacie')
print link_node,link_node['href'],link_node.get_text()
print "正则匹配
"
link_node = soup.find('a',href=re.compile(r"
ac
"))
print link_node.name,link_node['href'],link_node.get_text()
print "获取
P段落文字
"
p_node = soup.find('p',id="
firstpara"
)
print
p_node
.
name
,
p_node
.
get_text
(
)
''
'
# 搜索节点(find_all,find)
# 查找所有标签为a的节点
soup.find_all('
a
')
# 查找所有标签为a,连接符合/view/123.htm形式的节点
soup.find_all('
a
',href = '
/
view
/
123.htm
')
soup.find_all('
a
',href = re.compile(r'
/
view
/
\
d
+
\
.
htm
'))
# 查找所有标签为div,class为abc,文字为Python的节点
soup.find_all('
div
',class_ = '
abc
',string = '
python
')
# 访问节点信息
# 得到节点:<a href = '
1.html
'>Python</a>
# 获取查找到的节点的标签名称
node.name
# 获取查找到的a节点的href属性
node['
href
']
# 获取查找到的a节点的连接文字
node.get_text()
'
''
|