一. 目标
在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)
'''