读取文档
in Web Crawler 访问: 677 次 with 0 comment

读取文档

in Web Crawler with 0 comment

3TBg3GQyY_Q.jpg

读取文档

文档编码

纯文本文件、视频文件和图像文件的唯一区别,就是它们的 0 和 1 面向用户的转换方式不同。

纯文本

用网络爬虫的时候全部采用 UTF-8 编码读取内容,毕竟 UTF-8 也可以完美地处理 ASCII 编码。但是,要记住还有 9% 的网站使用 ISO 编码格式。所以在处理纯文本文档时,想用一种编码搞定所有的文档依旧不可能。

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

处理 HTML 页面的时候,网站其实会在 <head> 部分显示页面使用的编码格式。大多数网站,尤其是英文网站,都会带这样的标签:

<meta charset="utf-8" />

如果你要做很多网络数据采集工作,尤其是面对国际网站时,建议你先看看 meta 标签的内容,用网站推荐的编码方式读取页面内容。

CSV

虽然前两个方法也可以用,但是既然你可以轻易地把 CSV 文件保存在内存里,就不要 再下载到本地占硬盘空间了。直接把文件读成字符串,然后封装成 StringIO 对象,让 Python 把它当作文件来处理,就不需要先保存成文件了。

from urllib.request import urlopen
from io import StringIO
import csv
from bs4 import BeautifulSoup
data = urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode('ascii', 'ignore')
data_file = StringIO(data)
csv_reader = csv.reader(data_file)

for row in csv_reader:
    print(row)

csv.reader 返回的 csvReader 对象是可迭代的,而且由 Python 的列表对
象构成。

dictReader = csv.DictReader(dataFile)

csv.DictReader 会返回把 CSV 文件每一行转换成 Python 的字典对象返回,而不是列表对象,并把字段列表保存在变量 dictReader.fieldnames 里,字段列表同时作为字典对象的键

PDF

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 read_pdf(pdf_file):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams =  LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)

    process_pdf(rsrcmgr,device,pdf_file)

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

pdf_file = urlopen("http://pythonscraping.com/pages/warandpeace/chapter1.pdf")
output_string = read_pdf(pdf_file)
print(output_string)
pdf_file.close()

readPDF 函数最大的好处是,如果你的 PDF 文件在电脑里,你就可以直接把 urlopen 返回的对象 pdfFile 替换成普通的 open() 文件对象:

Responses