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

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

2013-11-21 11:22 996 查看

一. 目标

在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">2013年11月</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)
'''
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐