• Python 实现腾讯新闻抓取


    原文地址:http://www.cnblogs.com/rails3/archive/2012/08/14/2636780.htm

    思路:

    1.抓取腾讯新闻列表页面: http://news.qq.com/

    2.提取详细页面的url:http://news.qq.com/a/20120814/000070.htm

    3.在详细页中提取新闻标题和内容

    4.去除提取内容中的html标签,生成txt文档

    代码:

     1 #coding=utf-8
     2 import sys
     3 import urllib2
     4 import re
     5 import os
     6 
     7 def extract_url(info):
     8     rege="http://news.qq.com/a/d{8}/d{6}.htm"
     9     re_url = re.findall(rege, info)
    10     return re_url
    11 
    12 def extract_sub_web_title(sub_web):
    13     re_key = "<title>.+</title>"
    14     title = re.findall(re_key,sub_web)
    15     return title
    16 
    17 def extract_sub_web_content(sub_web):
    18     re_key = "<div id="Cnt-Main-Article-QQ".*</div>"
    19     content = re.findall(re_key,sub_web)
    20     return content
    21 
    22 def filter_tags(htmlstr):
    23     re_cdata=re.compile('//<![CDATA[[^>]*//]]>',re.I) #匹配CDATA
    24     re_script=re.compile('<s*script[^>]*>[^<]*<s*/s*scripts*>',re.I)#Script
    25     re_style=re.compile('<s*style[^>]*>[^<]*<s*/s*styles*>',re.I)#style
    26     re_p=re.compile('<Ps*?/?>')#处理换行
    27     re_h=re.compile('</?w+[^>]*>')#HTML标签
    28     re_comment=re.compile('<!--[^>]*-->')#HTML注释
    29     s=re_cdata.sub('',htmlstr)#去掉CDATA
    30     s=re_script.sub('',s) #去掉SCRIPT
    31     s=re_style.sub('',s)#去掉style
    32     s=re_p.sub('
    ',s)#将<p>转换为换行
    33     s=re_h.sub('',s) #去掉HTML 标签
    34     s=re_comment.sub('',s)#去掉HTML注释  
    35     blank_line=re.compile('
    +')#去掉多余的空行
    36     s=blank_line.sub('
    ',s)
    37     return s
    38 
    39 #get news
    40 content = urllib2.urlopen('http://news.qq.com').read()
    41 
    42 #get the url
    43 get_url = extract_url(content)
    44 
    45 #generate file
    46 f = file('result.txt','w')
    47 i = 15            #新闻起始位置,前面几条格式不一致
    48 flag = 30
    49 while True:
    50     f.write(str(i-14)+"
    ")
    51     
    52     #get the sub web title and content
    53     sub_web = urllib2.urlopen(get_url[i]).read()
    54     sub_title = extract_sub_web_title(sub_web)
    55     sub_content = extract_sub_web_content(sub_web)
    56 
    57     #remove html tag
    58     if sub_title != [] and sub_content != []:
    59         re_content = filter_tags(sub_title[0]+"
    "+sub_content[0])
    60         f.write(re_content.decode("gb2312").encode("utf-8"))
    61         f.write("
    ")
    62     else:
    63         flag = flag +1
    64     
    65     if i == flag:
    66         break
    67  
    68     i = i + 1
    69     print "Have finished %d news" %(i-15)
    70 f.close()

    说明:

    urllib2模块:进行网页内容抓取
    re模块:进行正则表达式提取
    decode("gb2312").encode("utf-8"):因为提取网页的编码是gb2312所以要解码后在编码到utf-8显示
    filter_tags:去除提取的内容的html标签,baidu可以找到这个函数,又修改了下

     

    调试中遇到的问题:

    1.Table 'polls.django_admin_log' doesn't exist
    今天没事调试一下DJANGO框架的时候官方的例子出现如下错误在这记录一下吧~!

    原因:数据库未同步

    解决方法:python manage.py syncdb

     

    2.IndentationError: unexpected indent python

    原因:缩进错误

    解决方法:删除缩进,统一用tab,注意tab设置为4空格

     

    3.[Errno 9] Bad file descriptor

    原因:读文件用了 fileopen(filename,”w”)

    解决方法:fileopen(filename,”r”)

     

    4. IndexError: list index out of range

    原因:for i in range(len(List))

    del len(List)

    在动态删除List过程中越界

    解决办法:不要动态删除,采用两个List操作

     

    5.TypeError: expected string or buffer
    原因:re_h=re.compile('</?w+[^>]*>')
    s=re_h.sub('',str)

    传入的str是list变量导致出错

    解决办法:传入str类型变量

    附:我的vim设置

    要在 ~ 目录下(即用户根目录)新建 .vimrc,这样对其它用户不影响

    syntax on
    set fileencodings=utf-8,cp936,big5,euc-jp,euc-kr,latin1,ucs-bom 
    set fileencodings=utf-8,gbk 
    set ambiwidth=double
    set langmenu=zh_CN.UTF-8
    set mouse=a
    set nu
    set foldmethod=indent
    set sw=4
    set ts=4
    set smarttab
    set spell
    set tw=78
    set lbr
    set fo+=mB
    set t_Co=256          //颜色覆盖问题,默认的效果太差
    colorscheme  default   //配色方案

    l

    syntax on
    set fileencodings=utf-8,cp936,big5,euc-jp,euc-kr,latin1,ucs-bom
    set fileencodings=utf-8,gbk
    set ambiwidth=double
    set langmenu=zh_CN.UTF-8
    set mouse=a
    set nu
    set foldmethod=indent
    set sw=4
    set ts=4
    set smarttab
    set spell
    set tw=78
    set lbr
    set fo+=mB
    set t_Co=256          //颜色覆盖问题,默认的效果太差
    colorscheme  default   //配色方案

  • 相关阅读:
    云原生 Serverless Database 使用体验
    如何画一张架构图(内含知识图谱)
    阿里云 Serverless Kubernetes 的落地实践分享
    【阿里云 CDP 公开课】 第二讲:CDH/HDP 何去何从
    阿里云数据治理系列(一):治理项目启动前的必答三问
    使用递归方法全选/反选TreeView中CheckBox子节点
    C# 安装部署项目 【转】
    HashTable存储树形数据
    Delphi中MessageBox用法【转】
    js nextSibling属性和previousSibling属性
  • 原文地址:https://www.cnblogs.com/mmix2009/p/3224299.html
Copyright © 2020-2023  润新知