Web Scraping with Python 学习笔记6

Chapter 6: Reading Documents

        本章主要解决文档读取问题,是否需要你下载下来再读取还是直接读取从中抽取你需要的数据,同时讨论一下不同文档的编码格式。

文本文档

        如果能直接爬取文本文档那是最好不过了,但是现在的网页都是HTML,XML等格式的,需要我们进行有针对的转换,通常情况下,我们把html文档转为BeautifulSoup对象,然后根据标签(比如:contents)获得文本内容,以下是纯文本文档爬取代码:

from urllib import urlopen  
textPage = urlopen("http://www.pythonscraping.com/pages/warandpeacechapter1.txt")
print(textPage.read())

        这里涉及到编码格式的问题,目前最通用的编码格式是由The Unicode Consortium这个非盈利组织制定的UTF-8格式(Universal Character Set - Transformation Format 8 bit),这里的8指8bit,并不是说所有的字符都是由8bit形成,而是指最小的编码位,我们可以用9bit,10bit等等,否则的话只能形成最多256个字符,显然不符合实际应用要求。另外一种比较流行的是ASCII码编码格式,使用7bit对字符编码,可形成128个字符,对于拉丁字符,不管大小写就足够使用了。
        实际应用中上述代码以默认对编码格式在大多数英文文档中可用,但是若是俄文,阿拉伯文等文档很容易出现乱码现象,我们需要自己设定编码格式,最后一句改为print(textPage.read(),'utf-8')
        事实上,在html文档的头部,通常会有meta标签,如<meta charset="utf-8" />,这使得我们很容易根据该文档的编码格式进行同样的编码格式解析。

CSV文档

        CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的(往往是私有的和/或无规范的格式)。
        网页爬取的过程中通常会涉及到表格,结果以CSV方式保存对接下来的数据分析是相当方便的。Python的CSV library主要是作用对象是存储在本地的文件,这就要求我们爬取CSV文件之后首先将其下载下来。其次写一个python脚本文件,读入该文件后再删去,最后以字符串的形式下载再以字符输入输出流对象的形式处理。最后一步往往会出现问题,类似表格的字段也会被处理,下面看一个例子:

from urllib import urlopen 
from io import StringIO
import csv

data = urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode('ascii', 'ignore')
dataFile = StringIO(data)
csvReader = csv.reader(dataFile)
for row in csvReader: 
    print("The album \""+row[0]+"\" was released in "+str(row[1]))

爬取的结果是Python list,类似这样:

['Name', 'Year']
["Monty Python's Flying Circus", '1970']
['Another Monty Python Record', '1971']
["Monty Python's Previous Record", '1972']
...

最后for循环输出的结果为:

The album "Name" was released in Year
The album "Monty Python's Flying Circus" was released in 1970
The album "Another Monty Python Record" was released in 1971 
The album "Monty Python's Previous Record" was released in 1972 
...

显然第一行不是我们想要的数据,它只是字段名而已,这里我们用csvReader对象的另一个函数DictReader()即可解决问题,将第六行改为dictReader = csv.DictReader(dataFile),也就是python list对象改为dictionary对象,输出结果:

['Name', 'Year']
{'Name': "Monty Python's Flying Circus", 'Year': '1970'}
{'Name': 'Another Monty Python Record', 'Year': '1971'}
{'Name': "Monty Python's Previous Record", 'Year': '1972'}

PDF文档

        PDF格式的文档最大的优点就是格式固定,打印之后不会出现意想不到的格式错乱问题,很适合选作为官方的、正式的文档格式。Python解析PDF的库为:PDFMiner3K,相当简单易用。

from urllib.request import urlopen
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO
from io import open
def readPDF(pdfFile):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)

    process_pdf(rsrcmgr, device, pdfFile)
    device.close()

    content = retstr.getvalue() 
    retstr.close()
    return content

pdfFile = urlopen("http://pythonscraping.com/pages/warandpeace/chapter1.pdf");
outputString = readPDF(pdfFile)
print(outputString) 
pdfFile.close()

        当然python可以直接使用open函数打开PDF文档,但是若文档中有图片、表格式的文字等特殊形式的东西处理效果差强人意。

Microsoft Word and .docx

        相比较其他的文本格式,word文档在python中很难处理,python-docx library这一款处理word文档的python库也只能创建或者读取文档的大小和标题等基础的东西,并不能完全解析文档内容,要读取真正的word文档,我们需要做一些功课:

        首先读取从文件中读取XML实体,其次对文档进行解析:

from zipfile import ZipFile
from urllib import urlopen 
from io import BytesIO

wordFile = urlopen("http://pythonscraping.com/pages/    AWordDocument.docx").read() 
wordFile = BytesIO(wordFile)  #line 5
document = ZipFile(wordFile)  #line 6
xml_content = document.read('word/document.xml') 

wordObj = BeautifulSoup(xml_content.decode('utf-8'),'lxml.parser')
textStrings = wordObj.findAll("w:t") #line 9
for textElem in textStrings:
    closeTag = "" 

    try:
        style = textElem.parent.previousSibling.find("w:pstyle") 
        if style is not None and style["w:val"] == "Title":  #line 14
            print("<h1>")
            closeTag = "</h1>"
    except AttributeError: 
        #No tags to print 
    pass 
    print(textElem.text) 
    print(closeTag)

        注:作者将这里的word文档嵌入到网页中了,代码中的urlopen地址都真实存在
        代码中我们可以看到word文档被以BytesIO这种二进制文件对象读取(line 5),文档中正文内容包含”w:t”标签,标题包含”w:val”标签,通过BeautifulSoup可以定位其内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值