精华内容
下载资源
问答
  • 使用python 提取html文件中特定数据

    万次阅读 2012-02-19 19:01:34
    用户只需SGMLParser类继承子类,并在子类对html文件做具体处理。 例如 具有如下结构的html文件 感兴趣内容1 感兴趣内容2 …… 感兴趣内容n 内容1 内容2 …… 内容n 我们尝试获得'感兴趣内容' ...

    python提供了SGMLParser类用于html文件的解析。用户只需从SGMLParser类继承子类,并在子类中对html文件做具体处理。

    例如 具有如下结构的html文件

    <div class='entry-content'>
    <p>感兴趣内容1</p>
    <p>感兴趣内容2</p>
    ……
    <p>感兴趣内容n</p>
    </div>
    <div class='content'>
    <p>内容1</p>
    <p>内容2</p>
    ……
    <p>内容n</p>
    </div>

    我们尝试获得'感兴趣内容'

    对于文本内容,我们保存到IDList中。
    可是如何标记我们遇到的文本是感兴趣的内容呢,也就是,处于
    <div class='entry-content'>
    <p>这里的内容</p>
    <p>还有这里</p>
    ……
    <p>以及这里的内容</p>
    </div>
    思路如下
    1. 遇到<div class='entry-content'> 设置标记flag = True
    2. 遇到</div>后 设置标记flag = False
    3. 当flag 为True时遇到<p> 设置标记getdata = True
    4. 遇到</p> 且getdata = True,设置getdata = False

    python为我们提供了SGMLParser类,SGMLParser 将 HTML 分析成 8 类数据[1],然后对每一类调用单独的方法:使用时只需继承SGMLParser 类,并编写页面信息的处理函数。

    可用的处理函数如下

    • 开始标记 (Start tag) 
    是一个开始一个块的 HTML 标记,象 <html>,<head>,<body> 或 <pre> 等,或是一个独一的标记,象 <br> 或 <img> 等。当它找到一个开始标记 tagname,SGMLParser 将查找名为 start_tagname 或 do_tagname 的方法。例如,当它找到一个 <pre> 标记,它将查找一个 start_pre 或 do_pre 的方法。如果找到了,SGMLParser 会使用这个标记的属性列表来调用这个方法;否则,它用这个标记的名字和属性列表来调用 unknown_starttag 方法。 
    • 结束标记 (End tag) 
    是结束一个块的 HTML 标记,象 </html>,</head>,</body> 或 </pre> 等。当找到一个结束标记时,SGMLParser 将查找名为 end_tagname 的方法。如果找到,SGMLParser 调用这个方法,否则它使用标记的名字来调用 unknown_endtag 。 
    • 字符引用 (Character reference) 
    用字符的十进制或等同的十六进制来表示的转义字符,象 &#160;。当找到,SGMLParser 使用十进制或等同的十六进制字符文本来调用 handle_charref 。 
    • 实体引用 (Entity reference) 
    HTML 实体,象 &copy;。当找到,SGMLParser 使用 HTML 实体的名字来调用 handle_entityref 。 
    • 注释 (Comment) 
    HTML 注释, 包括在 <!-- ... -->之间。当找到,SGMLParser 用注释内容来调用 handle_comment。 
    • 处理指令 (Processing instruction) 
    HTML 处理指令,包括在 <? ... > 之间。当找到,SGMLParser 用处理指令内容来调用 handle_pi。 
    • 声明 (Declaration) 
    HTML 声明,如 DOCTYPE,包括在 <! ... >之间。当找到,SGMLParser 用声明内容来调用 handle_decl。 
    • 文本数据 (Text data) 
    文本块。不满足其它 7 种类别的任何东西。当找到,SGMLParser 用文本来调用 handle_data。 


    综上,的到如下代码

    from sgmllib import SGMLParser
    class GetIdList(SGMLParser):
        def reset(self):
            self.IDlist = []
            self.flag = False
            self.getdata = False
            SGMLParser.reset(self)
            
        def start_div(self, attrs):
            for k,v in attrs:#遍历div的所有属性以及其值
                if k == 'class' and v == 'entry-content':#确定进入了<div class='entry-content'>
                    self.flag = True
                    return
    
        def end_div(self):#遇到</div>
    	self.flag = False
                
        def start_p(self, attrs):
            if self.flag == False:
                return
            self.getdata = True
        def end_p(self):#遇到</p>
            if self.getdata:
                self.getdata = False
    
        def handle_data(self, text):#处理文本
            if self.getdata:
                self.IDlist.append(text)
        def printID(self):
            for i in self.IDlist:
                print i
    

    上面的思路存在一个bug
    遇到</div>后 设置标记flag = False
    如果遇到div嵌套怎么办?
    <div class='entry-content'><div>我是来捣乱的</div><p>感兴趣</p></div>
    在遇到第一个</div>之后标记flag = False,导致无法的到‘感兴趣内容’。
    怎么办呢?如何判断遇到的</div>是和<div class='entry-content'>匹配的哪个呢?
    很简单,</div>和<div>是对应的,我们可以记录他所处的层数。进入子层div verbatim加1,退出子层div  verbatim减1.这样就可以判断是否是同一层了。


    修改后 如下
    from sgmllib import SGMLParser
    class GetIdList(SGMLParser):
        def reset(self):
            self.IDlist = []
            self.flag = False
            self.getdata = False
            self.verbatim = 0
            SGMLParser.reset(self)
            
        def start_div(self, attrs):
            if self.flag == True:
                self.verbatim +=1 #进入子层div了,层数加1
                return
            for k,v in attrs:#遍历div的所有属性以及其值
                if k == 'class' and v == 'entry-content':#确定进入了<div class='entry-content'>
                    self.flag = True
                    return
    
        def end_div(self):#遇到</div>
            if self.verbatim == 0:
                self.flag = False
            if self.flag == True:#退出子层div了,层数减1
                self.verbatim -=1
    
        def start_p(self, attrs):
            if self.flag == False:
                return
            self.getdata = True
            
        def end_p(self):#遇到</p>
            if self.getdata:
                self.getdata = False
    
        def handle_data(self, text):#处理文本
            if self.getdata:
                self.IDlist.append(text)
                
        def printID(self):
            for i in self.IDlist:
                print i
    


    最后  建立了我们自己的类GetIdList后如何使用呢?
    简单建立实例 t = GetIdList()
    the_page为字符串,内容为html
    t.feed(the_page)#对html解析

    t.printID()打印出结果


    全部测试代码为

    from sgmllib import SGMLParser
    class GetIdList(SGMLParser):
        def reset(self):
            self.IDlist = []
            self.flag = False
            self.getdata = False
            self.verbatim = 0
            SGMLParser.reset(self)
            
        def start_div(self, attrs):
            if self.flag == True:
                self.verbatim +=1 #进入子层div了,层数加1
                return
            for k,v in attrs:#遍历div的所有属性以及其值
                if k == 'class' and v == 'entry-content':#确定进入了<div class='entry-content'>
                    self.flag = True
                    return
    
        def end_div(self):#遇到</div>
            if self.verbatim == 0:
                self.flag = False
            if self.flag == True:#退出子层div了,层数减1
                self.verbatim -=1
    
        def start_p(self, attrs):
            if self.flag == False:
                return
            self.getdata = True
            
        def end_p(self):#遇到</p>
            if self.getdata:
                self.getdata = False
    
        def handle_data(self, text):#处理文本
            if self.getdata:
                self.IDlist.append(text)
                
        def printID(self):
            for i in self.IDlist:
                print i
    
    
    ##import urllib2
    ##import datetime
    ##vrg = (datetime.date(2012,2,19) - datetime.date.today()).days
    ##strUrl = 'http://www.nod32id.org/nod32id/%d.html'%(200+vrg)
    ##req = urllib2.Request(strUrl)#通过网络获取网页
    ##response = urllib2.urlopen(req)
    ##the_page = response.read()
    
    the_page ='''<html>
    <head>
    <title>test</title>
    </head>
    <body>
    <h1>title</h1>
    <div class='entry-content'>
    <div class= 'ooxx'>我是来捣乱的</div>
    <p>感兴趣内容1</p>
    <p>感兴趣内容2</p>
    ……
    <p>感兴趣内容n</p>
    <div class= 'ooxx'>我是来捣乱的2<div class= 'ooxx'>我是来捣乱的3</div></div>
    </div>
    <div class='content'>
    <p>内容1</p>
    <p>内容2</p>
    ……
    <p>内容n</p>
    </div>
    </body>
    </html>
    '''
    lister = GetIdList()
    lister.feed(the_page)
    lister.printID()
    执行后 输出为

    感兴趣内容1
    感兴趣内容2
    感兴趣内容n

    参考文献

    [1] 深入 Python:Dive Into Python 中文版

    展开全文
  • 提取TXT文本中指定内容——python

    万次阅读 多人点赞 2019-03-02 19:30:20
    PYTHON的计算机二级考试有这么一个题,要求我们一个文本中按照特定的格式提取指定内容。 文件名称为“论语-网络版.txt”,其内容采用如下格式组织: 【原文】 1.11子曰:“父在,观其(1)志;父没,观其行...

    项目介绍:

    在PYTHON的计算机二级考试中有这么一个题,要求我们从一个文本中按照特定的格式提取指定内容。
    文件名称为“论语-网络版.txt”,其内容采用如下格式组织:

    【原文】
    
    1.11子曰:“父在,观其(1)志;父没,观其行(2);三年(3)无改于父之道(4),可谓孝矣。”
    
    【注释】
    
    (略)
    
    【译文】
    
    (略)
    
    【评析】
    
    (略)
    

    该版本通过【原文】标记《论语》原文内容,采用【注释】、【译文】和【评析】标记对原文的注释、译文和评析。
    问题1:请编写程序,提取《论语》文档中所有原文内容,输出保存到“论语-提取版.txt”文件。输出文件格式要求:去掉文章中原文部分每行行首空格及如“1.11”等的数字标志,行尾无空格、无空行。参考格式如下(原文中括号及内部数字是对应源文件中注释项的标记):

    子曰(1):“学(2)而时习(3)之,不亦说(4)乎?有朋(5)自远方来,不亦乐(6)乎?人不知(7),而不愠(8),不亦君子(9)乎?”
    
    有子(1)曰:“其为人也孝弟(2),而好犯上者(3),鲜(4)矣;不好犯上,而好作乱者,未之有也(5)。君子务本(6),本立而道生(7)。孝弟也者,其为人之本与(8)?”
    
    子曰:“巧言令色(1),鲜(2)仁矣。”
    
    (略)
    

    问题2:请编写程序,在“论语-提取版.txt”基础上,进一步去掉每行文字中所有括号及其内部数字,保存为“论文-原文.txt”文件。参考格式如下:

    子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知,而不愠,不亦君子乎?”
    
    有子曰:“其为人也孝弟,而好犯上者,鲜矣;不好犯上,而好作乱者,未之有也。君子务本,本立而道生。孝弟也者,其为人之本与?”
    
    子曰:巧言令色,鲜仁矣。”
    
    (略)
    

    实现程序如下(python):

    fi = open("论语-网络版","r",encoding="utf-8")
    fo = open("论语-提取版.txt","w",encoding="utf-8")
    
    wflag =False                #写标记
    newline = []                #创建一个新的列表
    
    
    for line in fi :            #按行读入文件,此时line的type是str
        if "【" in line:        #重置写标记
            wflag =False
        if "【原文】" in line:     #检验是否到了要写入的内容
            wflag = True
            continue
        if wflag == True:
            K = list(line)
            if len(K)>1:           #去除文本中的空行
                for i in K :       #写入需要内容
                    newline.append(i)
    
    strlist = "".join(newline)      #合并列表元素
    newlines = str(strlist)         #list转化成str
    
    for D in range(1,100):                       #删掉句中()
        newlines = newlines.replace("({})".format(D),"")
    
    for P in range(0,9):                               #删掉前面数值标题
        for O in  range(0,9):
            for U in range(0, 9):
               newlines = newlines.replace("{}.{}{}".format(P,O,U), "")
    
    fo.write(newlines)
    
    fo.close()
    fi.close()
    

    运行结果如下:
    在这里插入图片描述

    其给的参考答案如下(分为两个程序):

    fi = open("论语-网络版","r",encoding="utf-8")
    fo = open("论语-提取版.txt","w",encoding="utf-8")
    wflag = False      #写标记
    for line in fi:
        if "【" in line :                  #遇到【时,说明已经到了新的区域,写标记置否
            wflag = False
        if "【原文】" in line:            #遇到【原文】时,设置写标记为Ture
            wflag = True
            continue
        if wflag == True:                 #根据写标记将当前行内容写入新的文件
            for i in range(0,25):
                for j in range(0,25):
                    line = line.replace("{}·{}".format(i,j),"**")
            for i in range(0,10):
                line = line.replace("*{}".format(i),"")
            for i in range(0,10):
                line = line.replace("{}*".format(i),"")
            line = line.replace("*","")
            fo.write(line)
    fi.close()
    fo.close()
    
    fi = open("论语-提取版.txt","r")
    fo = open("论语-原文","w")
    for line in fi:
        for i in range(1,23):
            line = line.replace("({})".format(i),"")
        fo.write(line)
    fi.close()
    fo.close()
    

    其运行结果如下:
    在这里插入图片描述

    展开全文
  • 该程序的目的是小说中提取虚构人物的名字,并分析该人物出现在文本中或在文本中被引用的句子,以建立一个包含每个人物特定数据的配置文件。 它是使用32位版本的Python 2.7,Natural Language Toolkit 2.0.4和...
  • 然后我们将展示如何使用正则表达式从文本中提取特定部分。 接下来,我们介绍将文本数据(非结构化数据)转换为表示感兴趣变量(结构化数据)的数值度量的想法。 具体来说,我们介绍了基于字典的方法:1) 测量文档...
  • 该脚本从文件中提取数据,删除无数据的行,对唯一数据进行排序并将其保存到文件中。 直方图 该脚本为响应时间数据生成直方图。 提取数据 该脚本提取与列中的特定文本匹配的响应时间数据,然后保存到新文件中。
  • 情感分析是指使用自然语言处理(NLP),文本分析和计算来系统地提取,识别信息并将其分类为特定类别。 该项目使用python sklearn库的高斯朴素贝叶斯和多项式朴素贝叶斯模型 朴素贝叶斯分类器 朴素贝叶斯分类器是...
  • 比如 处理有特定特点的文本、每月好多文件中提取出有用的信息生成Excel、每日要从特定的网站下载PDF报告 …… 简简单单,用Python写个几十行的脚本就搞定啦! 别人还在埋头苦干,对着电脑干瞪眼
  • 构建PyHCUP是为了SAS加载程序中提取元数据,然后使用该元数据来解析固定宽度的文本文件中的实际数据。 您仍然需要通过HCUP获取实际数据。 作者博客( 上的一系列帖子中提供了一组更详细的说明。 用法示例 加载...
  • Webcamgrab用户维护的网络摄像头列表随机提取JPG图像,并将其保存到特定文件和位置。 由于文件名和位置不变,因此可以将其选择为墙纸。 用Python 2.6编写,仅对于Linux,您将需要安装或已经安装了Python和lynx...
  • 关于sslv_web_scraper应用程序: 目的:该应用程序将您选择的... 将电子邮件发送到gmail,其中包含从文本文件中读取的报告 电子邮件报告包括按房间数筛选的选项 待办事项 添加日期字段提取功能 错误:日期值与
  • MUSE(R)XML文件提取ECG节奏条的实用程序。 它将MUSE XML文件转换为CSV文件,适合导入Excel和MATLAB。 0.3.0版本开始,该程序是为与Python 3一起使用而编写的。 版权信息 版权所有2009 GE Healthcare 该程序是...
  • 情感分析是指使用自然语言处理(NLP),文本分析和计算来系统地提取,识别信息并将其分类为特定类别。 该项目使用python sklearn库的高斯朴素贝叶斯和多项式朴素贝叶斯模型 朴素贝叶斯分类器 朴素贝叶斯分类器是...
  • 基于网页的开源协同多语言文本标注工具 、PreNLP:自然语言预处理库、简单的简历解析器,用来简历中提取关键信息、用于中文闲聊的GPT2模型:GPT2-chitchat、基于检索聊天机器人多轮响应选择相关资源列表...
  • 正则表达式经典实例.pdf

    热门讨论 2013-01-26 15:14:37
    7.8 URL中提取通信协议方案 7.9 URL中抽取用户名 7.10 URL中抽取主机名 7.11 URL中抽取端口号 7.12 URL中抽取路径 7.13 URL中抽取查询 7.14 URL中抽取片段 7.15 域名合法性验证 7.16 匹配IPv4地址 ...
  • 正则表达式经典实例

    2014-07-11 14:39:05
    7.8 URL中提取通信协议方案 7.9 URL中抽取用户名 7.10 URL中抽取主机名 7.11 URL中抽取端口号 7.12 URL中抽取路径 7.13 URL中抽取查询 7.14 URL中抽取片段 7.15 域名合法性验证 7.16 匹配IPv4...
  • The Flask Mega-Tutorial

    2018-05-17 15:16:58
    命令行运行 Python 脚本 Flask 的数据库 迁移 配置 数据库模型 创建数据库 第一次迁移 数据库升级和回退 数据库关系 编程时间 结束语 用户登录 回顾 配置 Python 3 兼容性 重构用户模型 user_...
  • TestDuBoKu.py

    2020-02-02 15:23:29
    Python爬虫爬取电影网站--独播库,原代码 爬虫的主要流程 构造url 爬虫要爬的数据,绝不仅仅是一个网页那么简单,有时候我们需要爬的...保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件
  • 端到端的深度模型可以避免人工提取特征,减少人工工作量,RNN序列模型对文本任务拟合能力强,rnn_attention在英文文本纠错比赛取得第一名成绩,证明应用效果不错; CRF会计算全局最优输出节点的条件概率,对句子...
  • 3.2.2 多个文件中读取数据 36 3.3 附言 42 3.4 其他格式 43 3.5 小结 45 第4章 纯文本中潜在的噪音数据 46 4.1 使用哪种纯文本编码? 46 4.2 猜测文本编码格式 50 4.3 对文本规范化处理 53 4.4 问题:在纯...
  • jdk-14_linux-x64_bin.rpm

    2020-03-30 09:57:57
    instanceof 运算符的模式匹配支持对象按条件来提取组件,此语言特性目前处于预览阶段。 343:Packaging Tool (Incubator) 打包工具(孵化阶段) 创建一个用于打包独立 Java 应用程序的工具。 345:...
  • Reaktoro:C++和python中用于对化学反应系统进行建模的计算框架。 LAMMPS:经典的用于材料建模的分子动力学代码,它是大范围原子/分子巨量平行模拟器的首字母缩写。 命令行界面 控制台/终端用户界面,命令行界面 ...
  • Lucene实战(第2版) 中文版

    热门讨论 2013-03-20 11:04:29
    lucene核心、lucene应用、案例分析3个方面详细系统地介绍了lucene,包括认识lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用tika提取文本、lucene的高级扩展、使用其他编程语言访问...
  • LuceneInAction(第2版)_中文版

    千次下载 热门讨论 2012-07-12 09:52:59
    Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本、Lucene的高级扩展、使用其他编程语言访问...
  • 如果在使用csv文件过程出现乱码、错乱等情况,需自行调对utf-8(带BOM)编码(或者使用文本编辑器 如 notepad++ 把文件转成需要的编码),文本限定符为"。 通过AreaCity-Geo格式转换工具可快速方便的将省市区、...
  • 数据来源:数据有CLUE benchmark提供,中国现当代作家文学作品抽取,再经语言专家人工挑选、标注。 数据形式: {"target": {"span2_index": 37, "span1_index": 5, "span1_text": "床", "span2_text": ...
  • 然后在你的浏览器打开此文件。看看这个页面你就知道你的PHP安装使用的选项了。 2.3 语法 就像前面提到的一样,你可以混合编写你的PHP代码和HTML代码。因此你必须有办法将两者区别开来。以下就是你可以采用的几种...
  • 018《Enhanced Github》“冰柜”到“冰棍儿”,下载Github单个文件 017《新浪微博图床》本地Markdown编写更流畅, 新浪微博图床来帮忙 016《解除B站区域限制》查看进击的巨人第三季 015 《XPath Helper》完成...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

python从文件中提取特定文本

python 订阅