暑假的任务里面有一个與情分析。这两天我爬取了一些数据准备在后面的时候用到。因为是高校的與情分析,数据的获取其实是一个蛮忧伤的事情。最后想了半天还是决定从百度新闻上面搜索到的新闻的价值可能会比较高一点。数据来源清晰后还有一个问题就是怎么直接抽取网页正文,我在试用了BeautifulSoup和xpath都没有找到满意的解决方案时,无意中找到了两个python的处理网页的库,感觉还是很不错的。推荐一下,分别就是readability-lxml和html2text。看一下他们的官方例子。
readability的:1
2
3
4from readability.readability import
Document import urllib html = urllib.urlopen(url).read()
readable_article = Document(html).summary()
readable_title = Document(html).short_title()
html2text的1
2# -*- coding: utf-8 -*- import html2text
print html2text.html2text(u'<html><body><div><div class="note" id="link-report"><p>(1)网页去噪</p><p>网页去噪需要去掉与网页内表达内容不相关的文字,如广告,评论等等。现在对于博客、新闻类的网页去噪已经有很多的应用,比如常用的印象笔记、有道笔记就用到了相关的技术。</p><p>因为项目的需要,也需要对网页进行去噪,留下有用的内容。所以在网上找了相关的网页去噪的开源项目。</p><p>(2)参考链接</p><p>主要参考的链接是这篇“网页正文抽取工具”, 应该是抓取的新浪weibo上的相关的微博内容。里面介绍了给出了项目的地址,有Java、C++、C#、Perl、Python的。</p><p>因为项目是Python写的,所以初步选定使用 Decruft , Python readability , Python boilerpipe ,Pyhon Goose这几种。</p><p>(3)实践操作</p><p>Python readability的使用:</p><p>from readability.readability import Document</p><p>import urllib</p><p>html = urllib.urlopen(url).read()</p><p>readable_article = Document(html).summary()</p><p>readable_title = Document(html).short_title()</p><p>最后抽取出来的readable_article是带HTML标签的文本。还需要进行clean html操作。如果需要得到纯文本内容,还需要做其他工作</p><p>“decruft is a fork of python-readability to make it faster. It also has some logic corrections and improvements along the way.” (引自:</p><a rel="nofollow" href="http://www.minvolai.com/blog/decruft-arc90s-readability-in-python/" target="_blank">http://www.minvolai.com/blog/decruft-arc90s-readability-in-python/</a><p>)</p><p>decruft是Python readability的fork版本,其主要提高了readability的速度。decruft的源码是放在Goolge上的,发现他只有0.1版本,而且是10年9月的,但是Python-readability一直在更新的,其核心的readability.py是7个月前更新的,所以不能保证decruft的性能要比现在的readability好,我没有下载decruft进行试验,有兴趣可以自己试验一下。</p><p>Python-boilerpipe:是Boilerpipe的Python版本的Warpper,在使用的时候需要依赖jpype, chardet. 在构造Extractor的时候可以定制自己需要的抽取器,具体有:</p><p>DefaultExtractor</p><p>ArticleExtractor</p><p>ArticleSentencesExtractor</p><p>KeepEverythingExtractor</p><p>KeepEverythingWithMinKWordsExtractor</p><p>LargestContentExtractor</p><p>NumWordsRulesExtractor</p><p>CanolaExtractor</p><p>这个项目可以自己选择抽取出的正文内容格式:可以是纯文本的,也可以是携带HTML的。</p><p>Python-Goose:</p><p>经过试验,决定使用Goose,可以在这个网址上测试 </p><a rel="nofollow" href="http://jimplush.com/blog/goose" target="_blank"> http://jimplush.com/blog/goose</a><p> Goose的抽取效果。Goose还能够获得Meta description。</p><p>Goose最后可以获得抽取后的纯文本。</p></div></div></body></html>')
在结合了这两个一起使用之后,感觉拿下来的抽取网页正文效果是不错的。代码如下。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45# -*- coding: utf-8 -*-
import urllib2
import sys
import re
from readability import Document
import html2text
import time
import os
#设置编码为utf-8
reload(sys)
sys.setdefaultencoding( "utf-8" )
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
base_url="http://news.baidu.com/ns?word={school}&pn={number}&rn=20"
school_list=['上海交通大学','同济大学','复旦大学','华东师范大学','上海大学','华东理工大学','东华大学','上海财经大学','上海外国语大学','华东政法大学','上海师范大学','上海理工大学','上海海事大学','上海海洋大学','上海中医药大学','上海体育学院','上海音乐学院','上海戏剧学院','上海对外经贸大学','上海电机学院','上海工程技术大学','上海科技大学','大连海事大学','武汉理工大学','广西航运学院','武汉交通科技大学','集美大学','南通海校','中国海洋大学']
for school in school_list:
os.mkdir(school)
count=0
for i in range(0,401,20):
url=base_url.format(school=school,number=i)
print url
time.sleep(4)
try:
request=urllib2.Request(url,headers=headers)
html=urllib2.urlopen(request).read()
re_result=r'<div class="result" .*?>(.*?)</div>'
re_href=r'<a href="(.*?)"'
result=re.findall(re_result,html,re.S|re.M)
for detail in result:
href=re.findall(re_href,detail,re.S|re.M)[0]
time.sleep(1)
try:
html=urllib2.urlopen(href,timeout=5).read()
readable_article = Document(html).summary()
result=html2text.html2text(readable_article)
print "processing...."
with open(school+"/"+str(count)+".txt","w") as f:
f.write(result)
count=count+1
except Exception,e:
print e