python爬取文件归类_python爬取各类文档方法归类汇总

HTML文档是互联网上的主要文档类型,但还存在如TXT、WORD、excel、PDF、csv等多种类型的文档。网络爬虫不仅需要能够抓取HTML中的敏感信息,也需要有抓取其他类型文档的能力。下面简要记录一些个人已知的基于python3的抓取方法,以备查阅。

1.抓取TXT文档

在python3下,常用方法是使用urllib.request.urlopen方法直接获取。之后利用正则表达式等方式进行敏感词检索。 ### Reading TXT doc ###

from urllib.request import urlopen

from urllib.error import URLError,HTTPError

import re

try:

textPage = urlopen("http://www.pythonscraping.com/pages/warandpeace/chapter1.txt")

except (URLError,HTTPError) as e:

print("Errors:\n")

print(e)

#print(textPage.read())

text = str(textPage.read())

#下面方法用正则匹配含1805的句子

pattern = re.compile("\..*1805(\w|,|\s|-)*(\.)")#不完美,简单示例

match = pattern.search(text)

if match is not None:

print(match.group())

#下面方法不用正则。先用.将句集分片,之后就可遍历了。

ss = text.split('.')

key_words = "1805"

words_list = [x.lower() for x in key_words.split()]

for item in ss:

if all([word in item.lower() and True or False for word in words_list]):

print(item)

上面的方法是已知目标网页为txt文本时的抓取。事实上,在自动抓取网页时,必须考虑目标网页是否为纯文本,用何种编码等问题。

如果只是编码问题,可以简单使用print(textPage.read(),'utf-8')等python字符处理方法来解决,如果抓取的是某个HTML,最好先分析,例如: from urllib.request import urlopen

from urllib.error import URLError,HTTPError

from bs4 import BeautifulSoup

try:

html = urlopen("https://en.wikipedia.org/wiki/Python_(programming_language)")

except (URLError,HTTPError) as e:

print(e)

try:

bsObj = BeautifulSoup(html,"html.parser")

content = bsObj.find("div",{"id":"mw-content-text"}).get_text()

except AttributeError as e:

print(e)

meta = bsObj.find("meta")

#print(bsObj)

if meta.attrs['charset'] == 'UTF-8':

content = bytes(content,"UTF-8")

print("-----------------UTF-8--------------")

print(content.decode("UTF-8"))

if meta.attrs['charset'] == 'iso-8859-1':

content = bytes(content,"iso-8859-1")

print("--------------iso-8859-1------------")

print(content.decode("iso-8859-1"))

2.抓取CSV文档

CSV文件是一种常见的数据存档文件,与TXT文档基本类似,但在内容组织上有一定格式,文件的首行为标题列,之后的文件中的每一行表示一个数据记录。这就像一个二维数据表或EXCEL表格一样。 python3中包含一个csv解析库,可用于读写csv文件,但其读取目标一般要求是在本地,要读取远程网络上的csv文件需要用urllib.request.urlopen先获取。例如: #csv远程获取,内存加载读取

from urllib.request import urlopen

import csv

from io import StringIO#在内存中读写str,如果要操作二进制数据,就需要使用BytesIO

try:

data = urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode("ascii","ignore")

except (URLError,HTTPError) as e:

print("Errors:\n")

print(e)

dataFile = StringIO(data)

csvReader = csv.reader(dataFile)

count = 0

for row in csvReader:

if count < 10:

print(row)

else:

print("...\n...")

break

count += 1

#将数据写入本地csv文件

with open("./localtmp.csv","wt",newline='',encoding='utf-8') as localcsvfile:

writer = csv.writer(localcsvfile)

count = 0

try:

for row in csvReader:

if count < 10:

writer.writerow(row)

else:

break

count += 1

finally:

localcsvfile.close()

csv文档的标题行(首行)需要特殊处理,csv.DictReader可以很好的解决这个问题。DictReader将读取的行转换为python字典对象,而不是列表。标题行的各列名即为字典的键名。 #csv.DictReader读取csv文件,可以有效处理标题行等问题

from urllib.request import urlopen

import csv

from io import StringIO#在内存中读写str,如果要操作二进制数据,就需要使用BytesIO

try:

data = urlopen("http://pythonscraping.com/files/MontyPythonAlbums.csv").read().decode("ascii","ignore")

except (URLError,HTTPError) as e:

print("Errors:\n")

print(e)

dataFile = StringIO(data)

csvReader = csv.reader(dataFile)

dictReader = csv.DictReader(dataFile)

print(dictReader.fieldnames)

count = 0

for row in dictReader:

if count < 10:

print(row)

else:

print("...\n...")

break

count += 1

3.抓取PDF文档

pdf文档的远程抓取与操作,可借助比较流行的pdfminer3k库来完成。 #抓取并操作pdf

#pdf READ operation

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,open

def readPDF(filename):

resmgr = PDFResourceManager()#STEP 1

retstr = StringIO()#STEP 2

laparams = LAParams()#STEP 3

device = TextConverter(resmgr,retstr,laparams=laparams)#STEP 4

process_pdf(resmgr,device,filename)#STEP 5

device.close()#STEP 6

content = retstr.getvalue()

retstr.close()

return content

try:

pdffile = urlopen("http://www.fit.vutbr.cz/research/groups/speech/servite/2010/rnnlm_mikolov.pdf")

except (URLError,HTTPError) as e:

print("Errors:\n")

print(e)

outputString = readPDF(pdffile)#也可以读取由pdffile=open("../../readme.pdf")语句打开的本地文件。

print(outputString)

pdffile.close()

4.抓取WORD

老版word使用了二进制格式,后缀名为.doc,word2007后出现了与OPEN OFFICE类似的类XML格式文档,后缀名为.docx。python对word文档的支持不够,似乎没有完美解决方案。为读取docx内容,可以使用以下方法:

(1)利用urlopen抓取远程word docx文件;

(2)将其转换为内存字节流;

(3)解压缩(docx是压缩后文件);

(4)将解压后文件作为xml读取

(5)寻找xml中的标签(正文内容)并处理 #读取word docx文档内容

from zipfile import ZipFile

from urllib.request import urlopen

from io import BytesIO

from bs4 import BeautifulSoup

wordFile = urlopen("http://pythonscraping.com/pages/AWordDocument.docx").read()

wordFile = BytesIO(wordFile)

document = ZipFile(wordFile)#

xml_content = document.read("word/document.xml")

#print(xml_content.decode("utf-8"))

wordObj = BeautifulSoup(xml_content.decode("utf-8"),"lxml")

textStrings = wordObj.findAll("w:t")

for textElem in textStrings:

print(textElem.text)

5.抓取EXCEL

6.抓取HTML源文档

7.抓取HTML表单数据

8.抓取Javascript数据

更多内容请参考专题《python爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET(C#)有哪些主流的ORM框架

前言 在以前的一篇文章中&#xff0c;为大家分享了《什么是ORM&#xff1f;为什么用ORM&#xff1f;浅析ORM的使用及利弊》。那么&#xff0c;在目前的.NET(C#)的世界里&#xff0c;有哪些主流的ORM&#xff0c;SqlSugar&#xff0c;Dapper&#xff0c;Entity Framework(EF)还…

android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM

开发中给ImageView加载一个高质量图片时&#xff0c;APP抛出了“Canvas: trying to draw too large(840253440bytes) bitmap.”的异常。猜测是图片占用内存太大&#xff0c;超出APP被分配的内存(我用的mate9&#xff0c;APP被分的内存差不多200m)&#xff0c;造成了OOM。解决方…

.net开源框架开源类库(整理)

常用库 Json.NET https://github.com/JamesNK/Newtonsoft.Json Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json&#xff0c;通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中…

docker jdk mysql_docker部署springboot前后端分离项目(jdk+jar包+mysql+redis+nginx)(示例代码)...

jdk1.8&#xff0c;dockerfile文件1.vim jdk-dockerfile?FROM centos:7MAINTAINER sinvie.cnWORKDIR /usrRUN mkdir /usr/local/javaADD jdk-8u221-linux-x64.tar.gz /usr/local/java/ENV JAVA_HOME /usr/local/java/jdk1.8.0_221ENV JRE_HOME $JAVA_HOME/jreENV CLASSPATH $J…

matlab连接mysql教程视频_Matlab建立到Oracle数据库的连接

Linux下的配置过程和Windows一样&#xff0c;如下&#xff1a;1、将Oracle JDBC的JAR包拷贝到Matlab的相关目录(..\matlab\java\jar\toolbox\)下。一、Matlab通过ODBC建立到Oracle数据库的连接1、在Windows下“开始”→“控制面板”→“性能和维护”→“管理工具”&#xff0c;…

C# App.config学习

进入公司一年多来&#xff0c;对配置文件添加了不少参数&#xff0c;但是从未想过这些参数是如何被读取出来的&#xff0c;今天把读取参数的处理看了一下&#xff0c;收获不少。假定有App.config如下 <?xml version"1.0" encoding"utf-8" ?> <…

php mysql 查询时间_PHP-MySQL查询需要大量时间才能执行

我正在开发时间表应用程序,并编写PHP代码以提取所有时间表直到日期.这是我为获取时间表而编写的查询-选择a.accnt_name,u.username,DATE_FORMAT(t.in_time,’&#xff05;H&#xff1a;&#xff05;i’)inTime,DATE_FORMAT(t.out_time,’&#xff05;H&#xff1a;&#xff05;…

大数据-----软件开发模型(详细讲解)

大数据学习免费学习资料&#xff08;免费教程&#xff09; 软件工程中&#xff0c;常用的开了模型有四种&#xff1a;瀑布模型、原型模型、增量模型和螺旋模型。 ⒈瀑布模型包括计划&#xff0c;需求分析、设计、编码、测试、运行维护六个阶段&#xff0c;阶段自上而下&#x…

python response[200_python – django上的代码200 httpresponse

我正在进行服务基本登录,我需要在Django视图中回答代码200和JSON,但我不知道这是否是使用HttpResponse库的正确形式&#xff1f;def Login(email,password):UserCUser()if User.is_valid(email,password) :userUser.find(email)datos[Id] str(user[Id])datos[Name] user[Name…

C#中struct和class的区别详解

本文详细分析了C#中struct和class的区别&#xff0c;对于C#初学者来说是有必要加以了解并掌握的。 简单来说&#xff0c;struct是值类型&#xff0c;创建一个struct类型的实例被分配在栈上。class是引用类型&#xff0c;创建一个class类型实例被分配在托管堆上。但struct和cla…

python面向对象编程的语言_怎么使用python面向对象编程

怎么使用python面向对象编程发布时间&#xff1a;2020-08-25 13:42:19来源&#xff1a;亿速云阅读&#xff1a;89作者&#xff1a;Leah本篇文章给大家分享的是有关怎么使用python面向对象编程&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家学习&#xff0c;希望大家阅…

软件测试计划时要记住什么

测试计划是软件测试生命周期的早期阶段之一。良好的计划是平稳执行阶段的关键&#xff0c;而糟糕的计划可能导致不必要的时间消耗。测试用例编写&#xff0c;资源分配等是作为测试计划的一部分执行的一些活动。 在规划过程中应注意并注意一些关键点&#xff0c;以避免将冗余问题…

ssm框架搭建连接mysql_从零开始搭建SSM框架(Spring + Spring MVC + Mybatis)

最近在回顾和总结一些技术&#xff0c;想到了把之前比较火的 SSM 框架重新搭建出来&#xff0c;作为一个小结&#xff0c;同时也希望本文章写出来能对大家有一些帮助和启发&#xff0c;因本人水平有限&#xff0c;难免可能会有一些不对之处&#xff0c;欢迎各位大神拍砖指教&am…

基于TFS实践敏捷-可视化管理

TFS是基于微软平台一套不错的系统&#xff0c;支持源码管理运行调试持续集成自动化测试Bug管理代码评审任务项管理文档管理沟通管理。 基于TFS 2015实践看板管理&#xff0c;让团队的数据可视化&#xff0c;让大家更多的关心产品、关注团队的努力&#xff0c;增强沟通、及时反映…

linux查看java版本_linux 查看java版本

inux查看java jdk安装路径和设置环境变量windows&#xff1a;set java_home:查看JDK安装路径java -version:查看JDK版本linux&#xff1a;whereis javawhich java (java执行路径)**echo $JAVA_HOME****echo $PATH**二&#xff1a;下面是配置linux的环境变量&#xff1a;(记得so…

[转载]基于TFS实践敏捷-修复Bug和执行代码评审

本主题阐释了这些功能&#xff0c;以继续这一关注虚拟敏捷团队成员的一天的教程。 Peter 忙于编写一些代码以完成积压工作 (backlog) 项任务。但是&#xff0c;他的同事发现了一个阻碍他们工作的 Bug&#xff0c;他想立即修复此 Bug。 他暂停了手中的工作并修复此 Bug。 他请求…

lzw压缩 java_java实现的LZW 压缩算法源码 | 学步园

导读&#xff1a;/** LZW.java** Created on 01 Dec 2005** Implementation of LZW compression/decompression algorithm*/import java.io.* ;/**** author Moshe Fresko* courseAlgorithmic Programming 1* exercise3*/public class LZW implements Compression{boolean stop…

单元测试入门

https://docs.microsoft.com/zh-cn/visualstudio/test/getting-started-with-unit-testing?viewvs-2019 使用 Visual Studio 定义和运行单元测试&#xff0c;使代码保持正常运行、确保代码覆盖率并在客户之前找到错误和缺陷。 经常运行单元测试&#xff0c;确保代码正常运行。…

java中乐观锁_Java中乐观锁与悲观锁的实现

锁(locking)业务逻辑的实现过程中&#xff0c;往往需要保证数据访问的排他性。如在金融系统的日终结算处理中&#xff0c;我们希望针对某个cut-off时间点的数据进行处理&#xff0c;而不希望在结算进行过程中(可能是几秒种&#xff0c;也可能是几个小时)&#xff0c;数据再发生…

.net开源框架简介和通用技术选型建议

.net体系 .net core .net 类库 asp.net mvc asp.net webapi asp.net core EF 跨平台和运行时解决方案&#xff08;解决方案&#xff09; Katana&#xff1a;微软基于OWIN规范实现的非IIS寄宿ASP.NET和MVC等。 MONO.NET&#xff1a;跨平台的.NET运行环境&#xff0c;让.NE…