1.文档编码:
文档编码是一种告诉程序——无论是计算机的操作系统还是 Python 代码——读取文档的规 则。文档编码的方式通常可以根据文件的扩展名进行判断,虽然文件扩展名并不是由编码 确定的,而是由开发者确定的。例如,如果我把 myImage.jpg 另存为 myImage.txt,不会出 现任何问题,但当我用文本编辑器打开它的时候就有问题了。好在这种情况很少见,如果 要正确地读取一个文档,必须要知道它的扩展名。
2.纯文本:
虽然把文件存储为在线的纯文本格式并不常见,但是一些简易网站,或者拥有大量纯文本 文件的“旧式学术”(old-school)网站经常会这么做。例如,互联网工程任务组(Internet Engineering Task Force,IETF)网站就存储了 IETF 发表过的所有文档,包含 HTML、PDF和纯文本格式(例如 https://www.ietf.org/rfc/rfc1149.txt)。大多数浏览器都可以很好地显示 纯文本文件,采集它们也不会遇到什么问题。
对大多数简单的纯文本文件,像 http://www.pythonscraping.com/pages/warandpeace/chapter1. txt 这个练习文件,你可以用下面的方法读取:
1 from urllib.request import urlopen 2 3 textPage = urlopen("http://www.pythonscraping.com/pages/warandpeace/chapter1-ru.txt") 4 print(str(textPage.read(),'utf-8'))
3.CSV:
Python 的 csv 库主要是面向本地文件,就是说你的 CSV 文件得存储在你的电脑上。而进行网络数据采集的时候,很多文件都是在线的。
-
手动把 CSV 文件下载到本机,然后用 Python 定位文件位置;
-
写 Python 程序下载文件,读取之后再把源文件删除;
-
从网上直接把文件读成一个字符串,然后转换成一个 StringIO 对象,使它具有文件的
属性。
4. PDF:
5. dox:
a. 从文件读取XML
1 from urllib.request import urlopen 2 from zipfile import ZipFile 3 from io import BytesIO 4 5 wordFile = urlopen("http://pythonscraping.com/pages/AWordDocument.docx").read() 6 wordFile = BytesIO(wordFile) 7 document = ZipFile(wordFile) 8 xml_content = document.read('word/document.xml') 9 print(xml_content.decode('utf-8'))
把一个远程 Word 文档读成一个二进制文件对象,再用 Python 的标准库 zipfile 解压(所有的 .docx 文件为了节省空间都 进行过压缩),然后读取这个解压文件,就变成 XML 了。
1 from urllib.request import urlopen 2 from zipfile import ZipFile 3 from io import BytesIO 4 from bs4 import BeautifulSoup 5 6 wordFile = urlopen("http://pythonscraping.com/pages/AWordDocument.docx").read() 7 wordFile = BytesIO(wordFile) 8 document = ZipFile(wordFile) 9 xml_content = document.read('word/document.xml') 10 11 wordObj = BeautifulSoup(xml_content.decode('utf-8')) 12 textStrings = wordObj.findAll("w:t") 13 14 for textElem in textStrings: 15 closeTag = "" 16 try : 17 style = textElem.parent.previousSibling.find("w:pstyle") 18 if style is not None and style["w:val"] == "Title": 19 print("<h1>") 20 closeTag = "<h1>" 21 except AttributeError: 22 #不打印标签 23 pass 24 print(textElem.text) 25 print(closeTag)