python进行文档抽取与解析的简单实现
来源:互联网 发布:中铁建沙特知乎 编辑:程序博客网 时间:2024/06/05 09:37
一、前文
之前被叫去做网络爬虫,爬取新浪新闻的url,标题,内容和评论,不过在需求上有点改变,主要是评论的间隔被要求有‘\t’的分割,比如将
<comment>
2014-12-10 18:53:20 1004400533 遗弃亲生骨肉猪狗不如,难道就不怕受到良心谴责?你能睡得安稳?
2014-12-10 17:17:07 3294923134 这父亲是人吗?
</comment>
改为
<comment>
2014-12-10 18:53:20 1004400533遗弃亲生骨肉猪狗不如,难道就不怕受到良心谴责?你能睡得安稳?
2014-12-10 17:17:07 3294923134这父亲是人吗?
</comment>
试过重新爬取,不过新浪在2015年后,做了些改变,一是评论api下的内容有了些修改,从原本的中文字符变为了'\u',解决办法可以参考另一篇博文三张图告诉你python爬虫时转换\u中文字符的“坑”,二是在爬虫上需要做好浏览器模拟的工作,不然很容易被封杀,而且,在做大规模爬取的时候,需要利用多线程或者分布式的手段进行,多线程稍不注意,到了系统线程的上限,这是要注意的。
二、抽取和解析
因为我想爬取这个页面(social)一年的内容,已经超过2万了(只算那些有评论的新闻),所以经常第二天回来发现中途error。分布式计算的东西现在还没去学习,所以还是复习一下python。
在这个简短的程序中,用到了SGMLParser类进行解析,这个类封装了可以实现对具有标签的字符串的处理函数,当然没有标签也是可以用的,不需要冠以html文本种类的要求,网上很多例子可能会拿HTMLParser与SGMLParser进行说明,通过解析X.html进行说明。这里我只采用单线程的方法。
SGMLParser:
1、通过利用开关变量的方法进行标签间内容的抽取和解析,在此之前,需要进行变量的初始化,可以利用__init__()或者__reset__(),一般用__reset__()。
2、start_x(),end_x(),handle_data(),这三个函数,第一个是当读取到<x>时,执行的函数,第一个是当读取到</x>时,执行的函数,第三个是当遇到标签内的内容,就会调用这个函数,更详细一点可以参考这篇博文
变量说明:
rootdir:原始文件目录
rootdir:需要存放转换好的文件目录
方法说明:
1、通过SGMLParser读取<comment></comment>中的内容,调用solve()函数,利用正则匹配的方法将原来不符合规范的空格替换为'\t',返回需要替换的内容到comment变量
2、利用正则匹配找到定位到<comment></comment>,替换为Parse类对象的comment值
(正则表达式的方法参考以下注释)
完整代码:
#!/usr/bin/env python# -*- coding: utf-8 -*-from sgmllib import SGMLParserimport re,osrootdir = 'F:\\Python27\\pythonproject\\fuck\\file1\\'rootdir2 = 'F:\\Python27\\pythonproject\\fuck\\file2\\'class Parse(SGMLParser): def __init__(self,filename): self.filename = filename self.comment = '' SGMLParser.__init__(self) def reset(self): self.found_comment = False SGMLParser.reset(self) def start_comment(self, attrs): self.found_comment = True def end_comment(self): self.found_comment = False def handle_data(self, text): if self.found_comment == True: self.comment=solve(self.filename,text)def solve(filename,text): #找到3个或3个以上空格的地方,替换为'\t' strinfo = re.compile('(\s\s\s*)') str_result = strinfo.sub('\t',text) return str_result if __name__ == '__main__': global rootdir,rootdir2 for parent,dirnames,filenames in os.walk(rootdir): #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字 for filename in filenames: #print filename filesource = open(rootdir+filename, 'a+') s = filesource.read() filesource.close() #初始化实例p,feed()函数为添加处理字符串 p = Parse(filename) p.feed(s) filedes = open(rootdir2+filename, 'a+') #因为原来原数据中存在不以</comment>结尾的内容,因此需要先做处理 pattern1='</comment>' if re.findall(pattern1,s) == []: s=s+'\n</comment>' <span style="white-space:pre"></span> #定位到comment标签位置,([\s\S]*)能够匹配所有字符,包括换行符,然后替换 strinfo = re.compile('<comment>([\s\S]*)</comment>') str_result = strinfo.sub('<comment>'+p.comment+'</comment>',s) filedes.write(str_result) filedes.close()
注意:win7系统一般文件夹下的文件总数(包括文件夹)不能超过21845个,不然会提示错误。
- python进行文档抽取与解析的简单实现
- Kettle实现简单的数据抽取
- python 简单的网络爬虫 + html 正文抽取
- Mysql日志抽取与解析
- 使用python进行简单的分词与词云
- DAO与Service层的泛型抽取与实现
- 一个python写的XML解析器的简单实现
- python实现解析oui.txt并抽取MAC前缀及组织名称
- python-21-如何读写json数据?如何解析简单的xml文档?
- 利用INFORMATICA实现增量数据的抽取与加载
- python在线编译器的简单原理与超简单实现
- JAXP对XML文档进行DOM解析实现增删改
- MyBatis与Spring整合——通过官方文档进行最简单的整合
- 从文档中抽取文本,实现 Word, Excel, PowerPoint 文件的全文搜索
- Tika解析抽取docx格式文档时提示找不到类
- Python实现Excel随机抽取数
- 使用Jdom进行简单的XML解析
- 利用Jsoup进行简单的HTML解析
- wget从oracle下载jdk8
- 碎语
- hibernate一对一主键双向关联
- php-fpm错误
- Q.2.3 Implement an algorithm to delete a node in the middle of a single linked list, given only acce
- python进行文档抽取与解析的简单实现
- 重建二叉树
- tomcat密码管理
- OpenCV基础07(序列)
- centos添加用户
- 2004
- 当析构函数遇到多线程 ── C++ 中线程安全的对象回调
- 使用 Python 开始游戏开发
- centos nginx设置多站点