[Python下载CSDN博客]4. V3版本_使用正则表达式分析HTML(一)

一. 目标


V2的基础上使用正则表达式来分析下载下来的html并提取内容.


需要的技术


1. 从网站抓取博客得到HTML字符串.

2. 正则表达式分析HTML字符串提取需要的数据.

3. 提取得到后的数据再转换为本地的数据.

4. 难点使用正则表达式分析HTML(因为对HTM和正则表达式都不太熟悉).


三. 步骤


3.1 获取"文章分类列表""文章存档列表"


3.1.1 分析博客主页的HTML


使用浏览器查看http://blog.csdn.net/bagboy_taobao_com 的HTML并保存为Index.html(保存的格式必须为UTF8, 否则会乱码). 双击打开Index.html, 可以正确显示. OK, 可以用文本打开分析.

3.1.2 分析"文章分类"HTML

<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/category/600202">ATL/WTL</a><span>(13)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/category/623494">Boost</a><span>(3)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/category/758331">C++模板</a><span>(3)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/category/484438">C/C++</a><span>(84)</span></li>
...
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/category/602741">DirectX</a><span>(2)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/category/663547">DLL</a><span>(3)</span></li>

有什么特点那就是http://blog.csdn.net/bagboy_taobao_com/article/category/600202">ATL/WTL</a>这里可以构造一条正则表达式http://blog\.csdn\.net/bagboy_taobao_com/article/category/.*?(?=</a>) 来匹配然后再最结果在构造一条正则表达式">来匹配得到地址和分类名.


3.1.3 分析"文章存档"HTML


<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/month/2013/11">2013年11月</a><span>(2)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/month/2013/10">2013年10月</a><span>(19)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/month/2013/09">2013年09月</a><span>(20)</span></li>
......
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/month/2013/03">2013年03月</a><span>(18)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/month/2013/02">2013年02月</a><span>(20)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/month/2013/01">2013年01月</a><span>(13)</span></li>
<li><a href="http://blog.csdn.net/bagboy_taobao_com/article/month/2012/12">2012年12月</a><span>(18)</span></li>

同上那就是http://blog.csdn.net/bagboy_taobao_com/article/month/2013/11">201311</a>这里可以构造一条正则表达式http://blog\.csdn\.net/bagboy_taobao_com/article/month/.*?(?=</a>) 来匹配然后再最结果在构造一条正则表达式">来匹配得到地址和分类名.

3.1.4 Python实现提取文章分类列表和文章存档列表

#!/usr/bin/env python
# coding=utf-8
# Python 2.7.3
# 获取博客文章分类列表和文章存档列表
# File: GetCategoryAndMonth.py
import urllib2
import httplib
import re

class CHYGetCategoryAndMonth:
	def Parser(self, htmlStr, type, list):
		listResult = []
		if 0 == type:
			pattern = re.compile(r'http://blog\.csdn\.net/bagboy_taobao_com/article/category/.*?(?=</a>)')
			listResult = pattern.findall(htmlStr)
		elif 1 == type:
			pattern = re.compile(r'http://blog\.csdn\.net/bagboy_taobao_com/article/month/.*?(?=</a>)')
			listResult = pattern.findall(htmlStr)
		
		for li in listResult:
			pattern = re.compile(r'">')
			listItem = pattern.split(li)
			item = listItem[:]
			list.append(item)
'''
# 测试代码
if __name__ == '__main__':
	conn = httplib.HTTPConnection("blog.csdn.net")
	# 要模拟成IE发送, 否则CSDN不接受Python的请求
	user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
	headersP = { 'User-Agent' : user_agent }
	conn.request(method = "GET", url = "/bagboy_taobao_com", headers = headersP)
	r1 = conn.getresponse()				# 获得响应
	htmlByte = r1.read()				# 获得HTML
	htmlStr = htmlByte.decode("utf8")	# 需要转换成utf8编码, 否则分析异常
	my = CHYGetCategoryAndMonth()
	list1 = []
	my.Parser(htmlByte, 1, list1)
	list0 = []
	my.Parser(htmlByte, 0, list0)
	print(list1)
	print(list0)
'''

3.2 根据"文章分类列表和文章存档列表"获取文章的URL


3.2.1 分析其中一个分类或者存档的HTML


使用浏览器查看http://blog.csdn.net/bagboy_taobao_com/article/month/2013/10  的HTML并保存为list.html(保存的格式必须为UTF8, 否则会乱码). 双击打开list.html, 可以正确显示. OK, 可以用文本打开分析

<span class="link_title"><a href="/bagboy_taobao_com/article/details/13092655">
<span class="link_title"><a href="/bagboy_taobao_com/article/details/13092605">
<span class="link_title"><a href="/bagboy_taobao_com/article/details/13092535">
......
<span class="link_title"><a href="/bagboy_taobao_com/article/details/12646185">

同上那就是<span class="link_title"><a href="/bagboy_taobao_com/article/details/这里可以构造一条正则表达式<span class="link_title"><a href="/bagboy_taobao_com/article/details/\d+ 来匹配然后再最结果在构造一条正则表达式/bagboy_taobao_com/article/details/\d+来匹配得到地址.


3.2.2 Python实现获取一个分类或者一个存档的文章URL

#!/usr/bin/env python
# Python 2.7.3
# 获取博客文章
# File: GetArticleList.py
import urllib2
import httplib
import re

class CHYGetArticleList:
	def Parser(self, htmlStr, list):
		pattern = re.compile(r'<span class="link_title"><a href="/bagboy_taobao_com/article/details/\d+')
		listResult = pattern.findall(htmlStr)
		
		for li in listResult:
			pattern = re.compile(r'/bagboy_taobao_com/article/details/\d+')
			listItem = pattern.findall(li)
			list.append(listItem[0])

'''
# http://blog.csdn.net/bagboy_taobao_com/article/month/2013/10
# 测试代码
if __name__ == '__main__':
	conn = httplib.HTTPConnection("blog.csdn.net")
	# 要模拟成IE发送, 否则CSDN不接受Python的请求
	user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
	headersP = { 'User-Agent' : user_agent }
	conn.request(method = "GET", url = "/bagboy_taobao_com/article/month/2013/10", headers = headersP)
	r1 = conn.getresponse()				# 获得响应
	htmlByte = r1.read()				# 获得HTML
	htmlStr = htmlByte.decode("utf8")	# 需要转换成utf8编码, 否则分析异常
	list = []
	my = CHYGetArticleList()
	my.Parser(htmlByte, list)
	print(list)
'''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值