Python读取纯文本和CVS - KelovpString

/ 0评 / 0

    之前在百科看到一句介绍HTML网站的话:经过点缀的多媒体集合。但这些集合当中的元素我在Get的时候往往也遇到了一些问题,不论是编码问题还是js,对于我而言这些东西在简单采集的时候几乎是非常致命的,不过还好,工具足够强大。这里附编码格式简介文:http://blog.jobbole.com/30526/

纯文本

    虽然把文件存储在线的纯文本格式并不常见,但是一些学术网站往往为了便于维护将一些资料存储为纯文本,就现在而言主流浏览器往往能够正确显示且阅读。(但是他喵的就是没有找到合适的,只有自己开服务器了。。)

#use python3.5
from urllib.request import urlopen
textPage = urlopen("http://loaclhost:8080/Home/TheTheif/re.txt")
print(textPage.read())

    通常,当urlopen获取了网页之后会转变被BeautifulSoup对象,方便解析。但是在这块就有点难受了:文本读取之后可不是html,没有标签。这时候再强行转为beautifulSoup对象再进行处理就有点难受了,而此刻要进行数据提取和人工检索没有任何区别,实在是没有任何意义。同时这里也存在一个问题:这个网址的文章是英文的。。假如是中文或者是俄文就会出现下面这种情况:


    很明显编码不对,对上面的程序进行修改可继续向下:

from urllib.request import urlopen
textPage = urlopen("http://localhost:8080/Home/TheThief/The.txt")
print(str(textPage.read()).encode("utf-8"))

     在之前我有在头部放charset utf-8来解决 ,也可以直接在提取出之后(但源码肯定英文除了一些中文网址)转为UTF-8

html =urlopen("http://en.wikipedia.org/wiki/Python_(programming_language)")
bsObj = BeautifulSoup(html)
content = bsObj.find("div", {"id":"mw-content-text"}).get_text()
content = bytes(content, "UTF-8")
content = content.decode("UTF-8")

而中文网站在头部往往有这个:

<meta charset="utf-8" />

或者是

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">

那么每次在提取之前得 稍微注意一下这个头部,以防乱码的出现。

CVS

    上次为了搞定数据库所以里面夹杂了不少关于csv的简介,但是python的福利就又来了。在采集网页的时候有时候可能会遇到csv文件,也可能想把数据存储为cvs格式,这时候就有一些好用的办法:python有一个超赞的标准库:https://docs.python.org/3.4/library/csv.html可以读写csv文件。而python的 csv库主要面向于本地文件,也就是说csv得存在本地的硬盘当中。但是在进行网络采集的时候很多资源都是在线的,不过这也是小问题:

手动把 CSV 文件下载到本机,然后用 Python 定位文件位置;
Python 程序下载文件,读取之后再把源文件删除;
从网上直接把文件读成一个字符串, 然后转换成一个 StringIO 对象,使它具有文件的属性。
    显然前两种办法可行但是很笨重,既然已经把文件保存在内存当中为何要下载呢。所以直接把文件读成字符串然后封装成StringIO对象,让python把他当做文件来处理,就无需保存成文件了。(话说我又没找到网络可用的资源继续我的服务器:正好那天遍历wiki有四百多条数据-=)

from urllib.request import urlopen
from io import StringIO
import csv
data = urlopen("http://localhost:8080/a.csv").read().decode('ascii', 'ignore')
dataFile = StringIO(data)
csvReader = csv.reader(dataFile)
for row in csvReader:
    print(row)

    不难看出是csv.reader返回的对象是可迭代的。(这里是字典不是list)这样一来也可以轻易提取:

for row in csvReader:
    print("The album \""+row[0]+"\" was released in "+str(row[1]))

    但是上面的内容在执行的时候会有一句The album "Name" was released in Year 。虽对整体没有什么太大的影响但是在实战 当中或许会影响一些的结果,所以在此时得想办法吧第一行给处理掉:

dictReader = csv.DictReader(dataFile)

csv.DictReader 会返回把 CSV 文件每一行转换成 Python 的字典对象返回,而不是列表对象,并把字段列表保存在变量 dictReader.fieldnames 里,字段列表同时作为字典对象的键。使用DictReader可能在输出的时候得稍作处理,但是还是十分值得去写的

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注