获取网页的正文
【四方】2013/08/27软件综合 IP:吉林
有什么办法可以直接获取一个网页的正文?想想就觉得挺难,里面有这么多HTML元素,还真不知道应该提取哪里。
这里有一个原理的讲解:XXXXXXXXXXXXXXXXXXXXXX/p/cx-extractor/
这里是针对它的python实现。
001
# -*- coding=utf-8 -*-
002
import sys, os, codecs, re
003

004
reload(sys)
005
XXXXXXtdefaultencoding('utf-8')
006

007
import cProfile
008
import urllib2
009

010
re_title = XXXXXXpile(r'<title>(.*?)</title>', re.I|re.U|re.S)
011
re_body = XXXXXXpile(r'<body[^>]*>.*</body>', re.I|re.U|re.S)
012
re_doc_type = XXXXXXpile(r'<!DOCTYPE.*?>', re.I|re.U|re.S)
013
re_comment = XXXXXXpile(r'<!--.*?-->', re.I|re.U|re.S)
014
re_js = XXXXXXpile(r'<script.[^>]*>.*?</script>', re.I|re.U|re.S)
015
re_css = XXXXXXpile(r'<style[^>]*>.*?</style>', re.I|re.U|re.S)
016
re_special = XXXXXXpile(r'&.{2,8};|&#.{2,8};', re.I|re.U|re.S)
017
re_other = XXXXXXpile(r'<[^>]*>', re.I|re.U|re.S)
018

019
BLOCK_HEIGHT = 3
020
THRESHOLD = 90
021

022
class TextExtract(object):
023
    def __init__(self, new_html, join=True):
024
        XXXXXXXml = new_html
025
        XXXXXXXin = join
026
        self.text_start = 0
027
        self.text_end = 0
028
        self.text_body = ''
029
        self.block_len = []
030
        self.title = ''
031
        XXXXXXXntent = ''
032
        
033
        self.extract()
034

035
    def extract(self):
036
        self.extract_title()
037
        self.extract_body()
038
        XXXXXXXmove_tags()
039
        self.extract_text()
040
    
041
    def extract_title(self):
042
        m = re_XXXXXXXXarch(XXXXXXXml)
043
        if m:
044
            self.title = XXXXoup(1)
045

046
    def extract_body(self):
047
        m = re_XXXXXXXarch(XXXXXXXml)
048
        if m:
049
            self.text_body = XXXXoup()
050

051
    def remove_tags(self):
052
        self.text_body = re_doc_type.sub('', self.text_body)
053
        self.text_body = re_comment.sub('', self.text_body)
054
        self.text_body = re_js.sub('', self.text_body)
055
        self.text_body = re_css.sub('', self.text_body)
056
        self.text_body = re_special.sub('', self.text_body)
057
        self.text_body = re_other.sub('', self.text_body)
058

059
    def extract_text(self):
060
        lines = self.text_body.split('\n')
061
        line_len = len(lines)
062
        for i in xrange(0,line_len,1):
063
            lines[i] = re.sub(r'\s+', ' ', lines[i]).strip()
064
        
065
        for i in xrange(1,line_len-1,1):
066
            if len(lines[i]) > 0 and len(lines[i]) < 30 and 0 == len(lines[i-1]) and 0 == len(lines[i+1]):
067
                lines[i] = ''
068

069
        for i in xrange(0, len(lines)-BLOCK_HEIGHT, 1):
070
            line_len = 0
071
            for j in xrange(0, BLOCK_HEIGHT, 1):
072
                line_len += len(lines[i+j])
073
            self.block_len.append(line_len)
074

075
        self.text_start = XXXXXXXnd_text_start(0)
076
        self.text_end = 0
077

078
        if(0 == self.text_start):
079
            XXXXXXXntent = 'nothing can find'
080
        else:
081
            if XXXXXXXin:
082
                line_lens = len(lines)
083
                while self.text_end < line_lens:
084
                    self.text_end = XXXXXXXnd_text_end(self.text_start)
085
                    XXXXXXXntent += XXXXXXXt_text(lines)
086
                    self.text_start = XXXXXXXnd_text_start(self.text_end)
087
                    if 0 == self.text_start:
088
                        break
089
                    self.text_end = self.text_start
090
            else:
091
                self.text_end = XXXXXXXnd_text_end(self.text_start)
092
                XXXXXXXntent += XXXXXXXt_text(lines)
093

094
    def find_text_start(self, index):
095
        blk_len = len(self.block_len)
096
        for i in xrange(index, blk_len-1, 1):
097
            if self.block_len[i] > THRESHOLD and self.block_len[i+1] > 0:
098
                return i
099
        return 0
100

101
    def find_text_end(self, index):
102
        blk_len = len(self.block_len)
103
        for i in xrange(index, blk_len-1, 1):
104
            if 0== self.block_len[i] and 0== self.block_len[i+1]:
105
                return i
106
        return blk_len-1
107

108
    def get_text(self, lines):
109
        str = ''
110
        for i in xrange(self.text_start, self.text_end, 1):
111
            str += lines[i]+'\n'
112
        return str
113

114
#with codecs.open('/home/yz/download/XXXXXXml', 'r', 'utf-8') as file:
115
#    html = XXXXXXXad()
116
#    text_extract = TextExtract(html)
117
#    print text_XXXXXXXXXXntent
118

119
#text_extract = TextExtract('<html><title>asdfasf</title><body>\nasdfasfd</body></html>')
120
#print text_XXXXXXXXXXntent
121

122
try:
123
    url = 'XXXXXXXXXXXXXXXXXXXXX'
124
    proxied_request = urllib2.urlopen(url)
125
    status_code = proxied_XXXXXXXXXXde
126
    mimetype = proxied_request.headers.typeheader or XXXXXXXXXXXXess_type(url)
127
    content = proxied_XXXXXXXXXXad()
128
    #encoding = proxied_request.headers['content-type'].split('charset=')[-1]
129
    #ucontent = unicode(content, encoding)
130
    text_extract = TextExtract(content)
131
    print text_XXXXXXXXXXntent
132

133
except XXXXXXXXXXTPError as e:
134
    print e

转自 开源中国 余争 发布于 2013年08月12日 12时
来自:计算机科学 / 软件综合
0
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
【四方】
学者 机友 笔友
文章
135
回复
1318
学术分
1
2013/03/23注册,4年8个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}