整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JAVA获取网页文本内容

JAVA获取网页文本内容

要核心类就是:

URLConnection

代码如下:

public static String sendGet(String url, HashMap<String,String> requestHead) throws Exception {
 URL url1=new URL(url);
 URLConnection connection=url1.openConnection();
 connection.setRequestProperty("Accept","*/*");
 connection.setRequestProperty("Connection","Keep-Alive");
 if(requestHead==null){
 }else{
 for(String key:requestHead.keySet()){
 connection.setRequestProperty(key,requestHead.get(key));
 }
 }
 InputStream inputStream=connection.getInputStream();
 byte[] bytes=new byte[1024];
 ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
 int len=0;
 while((len=inputStream.read(bytes))!=-1){
 outputStream.write(bytes,0,len);
 }
 String ret=new String(outputStream.toByteArray());
 String charset=getWebCharset(ret);
 return new String(outputStream.toByteArray(),charset);
}

其中的getWebCharaset是自动匹配网页编码,代码如下:

public static String getWebCharset(String str){
 String charset="UTF";
 try{
 charset=TextUtil.getMiddleText(str,"charset=",">").substring(0,3);
 charset=charset.replaceAll("\"","");
 charset=charset.replaceAll("'","");
 }catch (NullPointerException e){
 }
 charset=charset.toUpperCase();
 if(charset.startsWith("UT")){
 charset="UTF8";
 }else if(charset.startsWith("GB2")){
 charset="GB2312";
 }else if(charset.startsWith("GBK")){
 charset="GBK";
 }
 return charset;
}

当然匹配的方式有很多种,可以自己实现。

所周知,python最强大的地方在于,python社区汇总拥有丰富的第三方库,开源的特性,使得有越来越多的技术开发者来完善。

python的完美性。

未来人工智能,大数据方向,区块链的识别和进阶都将以python为中心来展开。

咳咳咳! 好像有点打广告的嫌疑了。

当前互联网信息共享时代,最重要的是什么?是数据。最有价值的是什么?是数据。最能直观体现技术水平的是什么?还是数据。

所以,今天我们要分享的是:如何来获取各个文件格式的文本信息。

普通文件的格式 一般分为: txt普通文本信息,doc word文档,html网页内容,excel表格数据,以及特殊的mht文件。

一、Python处理html网页信息

html类型的文本数据,内容是由前端代码书写的标签+文本数据的格式,可以直接在chrome浏览器打开,清楚 的展示出文本的格式。

python 获取html文件的内容和获取txt文件的方法相同,直接打开文件读取就可以了。

读取代码如下:

with open(html_path, "r", encoding="utf-8") as f:
 file=f.read()

file 是html文件的文本内容。是一个网页标签的格式内容。

二、Python处理excel表格信息

python拥有直接操作excel表格的第三方库xlwt,xlrd。调用对应的方法就可以读写excel表格数据。

读取excel操作代码如下:

filepath="C:\\Users\Administrator\Desktop\新建文件夹\笨笨 前程6份 武汉.xls"
sheet_name="UserList"
rb=xlrd.open_workbook(filepath)
sheet=rb.sheet_by_name(sheet_name)
# clox_list=[0, 9, 14, 15, 17]
for row in range(1, sheet.nrows):
 w=WriteToExcel()
 # for clox in clox_list:
 name=sheet.cell(row, 0).value
 phone=sheet.cell(row, 15).value
 address=sheet.cell(row, 9).value
 major=sheet.cell(row, 14).value
 age=sheet.cell(row, 8).value

其中row是表格数据对应的行数, cell获取具体行数,列数的具体数据。

三、Python读取doc文档数据

python读取doc文档是最麻烦的。处理逻辑复杂。处理的方式也有很多种。

python 没有直接处理doc文档的第三方库,但是有一个处理docx的第三方库。可以通过将doc文件转换为docx文件,再调用第三方python库pydocx来读取doc文档的内容。

这里需要注意的是,不要直接修改doc的后缀来修改成docx文件。直接通过修改后缀获取的docx文件,pydocx无法读取内容。

我们可以使用另外一个库来修改doc为docx。

具体代码如下:

def doSaveAas(self, doc_path):
 """
 将doc文档转换为docx文档
 :rtype: object
 """
 docx_path=doc_path.replace("doc", "docx")
 word=wc.Dispatch('Word.Application')
 doc=word.Documents.Open(doc_path) # 目标路径下的文件
 doc.SaveAs(docx_path, 12, False, "", True, "", False, False, False, False) # 转化后路径下的文件
 doc.Close()
 word.Quit()

代码所需的包接口:

import os
import zipfile
from win32com import client as wc
import xlrd
from bs4 import BeautifulSoup
from pydocx import PyDocX
from lxml import html
from xpath_content import XpathContent
from write_to_excel import WriteToExcel

python处理docx文档的方法有很多种,具体使用情况,根据个人需求来决定。

No.1 解压docx文件

docx文件的原理,本质上就是一个压缩的zip文件,通过解压以后,就可以获取原来文件的各个内容。

docx解压后的文件结构如下:



docx文件的文本内容存储结构如下:

文本内容存储于word/document.xml文件中。



第一种方法,我们就可以先将docx还原成zip压缩文件,再解压zip文件,读取word/document.xml文件的内容就ok了。

具体操作代码如下:

def get_content(self):
 """
 获取docx文档的文本内容
 :rtype: object
 """
 os.chdir(r"C:\Users\Administrator\Desktop\新建文件夹") # 改变目录到文件的目录
 #
 os.rename("51 2014.09.12 1份Savannah.docx", "51 2014.09.12 1份Savannah.ZIP") # 重命名为zip文件
 f=zipfile.ZipFile('51 2014.09.12 1份Savannah.ZIP', 'r') # 进行解压
 xml=f.read("word/document.xml")
 wordObj=BeautifulSoup(xml.decode("utf-8"))
 # print(wordObj)
 texts=wordObj.findAll("w:t")
 content=[]
 for text in texts:
 content.append(text.text)
 content_str="".join(content)
 return content_str

最后获取到的就是docx文档的所有文本数据了。

No.2 将docx文档转换成python能够处理的文本格式

第一种方法,是依据docx文档的原理来获取数据,流程有点繁琐,有没有能直接读取docx文档内容的方法呢?答案,肯定是没有的,别想了,洗洗回家睡吧。

直接读取docx文档的方法没有,有没有能够将docx文档转换成python能够轻松处理的文本格式呢?

这个可以有,前面说了,python拥有大量丰富的第三方库(先夸一波我大python),历经千辛万苦终于找到了,一个能转换docx文档格式的第三方库,pydocx,pydocx库中有个方法pydocx.to_html()就可以直接将docx文档转换为html文件,怎么样?意不意外,惊喜不惊喜!

第二种方法,转换文本格式的代码如下:

def docx_to_html(self, docx_path):
 """
 docx文档转换成html响应
 :rtype: object
 """
 # docx_path="C:\\Users\Administrator\Desktop\新建文件夹\\51 2014.09.12 1份Savannah.docx"
 response=PyDocX.to_html(docx_path)

获取到的response是html文件内容。

四、Python处理mht文件

mht文件是一种只能在IE浏览器上展示的文本格式,在chrome浏览器中打开是一堆的乱码。

No.1 伪造IE请求mht文件内容

最基础的读取mht文本的方法就是伪造IE浏览器请求。

调用requests库,发送get请求网页链接,构造IE的请求头信息。

理论上来说,这种方法是可行的。但是呢,不建议用,原因大家都懂得。


No.2 转换文件格式

好了说正经的方法,猜测mht文件能否修改成其他文件格式来直接读取呢?

docx,不行;html,不行;excel,更不用说了。

真相只有一个!!!

直接修改后缀得到的docx,无法读取。

so,我们想到的方法是什么呢。没错,就是修改成doc文档。

方法是匪夷所思的,但也是灵感一现。

mht可以直接通过修改后缀转换成doc文档,doc文档读取文本内容的方法具体参考上面读取doc文档的方法。

如何获取html文本的内容?

html文本的内容是网页结构标签数据,取出文本的方式是:re正则,或者xpath。

后续,小伙伴有需要的话,会再开一章详细了解re,xapth的使用规则。

来源网络,侵权联系删除

#34;VBA信息获取与处理"教程中第八个专题"VBA与HTML文档"的第七节"HTML DOM的对象事件及关联"太枯燥了,希望想掌握这方面知识的朋友能参考我的教程学习。我们今天 开始第九个专题的学习"利用IE抓取网络数据"。

我们的网抓部分在讲解了XMLHTTP方法后,利用两个专题的进度进行了一些和VBA关系不是很大的有关网络知识的讲解,这两个专题对于我们重新认识网抓数据有着非常重要的意义,虽然我的讲解还不能面面俱到,但对于我经常倡导的VBA定位来说,是足够的,再者,学习是个不断积累前进的过程,要掌握的是一些基本的理论,然后把这些应用到自己的实际中去,这才是关键。从这个专题开始我们继续网抓的学习。这个专题是利用IE抓取网络数据。其实就是利用控件来完成我们的工作。


第一节 利用IE法提取网页数据基础

为了获取网页的数据,我们可以通过创建IE控件或webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。

这种方法可以模拟大部分的浏览器操作。浏览器能看到的数据就能用代码获取,但是有个致命的缺点:除去各种弹窗相当烦人外,兼容性也确实是个很伤脑筋的问题。在我自己的实践中感觉这种方法不是很稳定(仅仅是感觉)。

1 IE模型的创建

我们在实际工作中遇到网站和网页相关问题,例如:如何下载网页数据?网页之间的通讯是怎么实现的、它们能不能被控制等等。如果你是用VB/VBA/脚本或其它支持自动化对象(AUTOMATION)的语言编程,有一个值得了解的方法是掌握对象模型:将网页视为对象来控制,这个方法需要了解的是IE的自动化对象(InternetExplorer.Application)或IE控件(Microsoft Internet Controls),以及标准的文档对象模型(Document)。相关的知识我在前两个专题中做了大量的讲解,这里就不再详细的说明了。

我给出下面的代码:

Set ie=CreateObject("InternetExplorer.Application") '创建对象

ie.Visible=True '使IE页面可见,做完这一步,在VBA之外可以看到一个新的IE

ie.navigate "about:blank" '建立一个空白页

上面这几行代码的作用是创建一个IE应用程序对象,并打开一个空白的网页。这个网页独立于VBA的应用程序(WORD或EXCEL)之外,事实上,你必须自已关掉它,或者用ie.Quit下令退出——注意一下,单纯的关闭VBA或SET ie=nothing是不会退出这个网页的。我们经常用的是将第3行的字符串替换成一个网站的名字,或者替换成一个你主机中的文档名,也可以是一个图片名,都是可以的。和你在IE地址栏输入名称浏览这些文档是一样效果。

如果仅仅是创建了一个空的模型是没有任何利用的价值的,我们需要真正的网页,这时就需要我们在VBA的应用程序外打开一个完整的网页了,直到网页完全加载我们的操作才能向下进行。

2 IE网页页面的加载

我们修正一下上面的那段打开空网页的代码:

Sub mynz()

Set ie=CreateObject("InternetExplorer.Application") '创建对象

ie.Visible=True '使IE页面可见,做完这一步,在VBA之外可以看到一个新的IE

ie.navigate " https://baijiahao.baidu.com" '建立一个空白页

Do Until .ReadyState=4 '检查网页是否加载完毕(4表示完全加载)

DoEvents '循环中交回工作权限给系统,以免"软死机"

Loop

End sub

在上面的代码中增加了几行:

Do Until .ReadyState=4 '检查网页是否加载完毕(4表示完全加载)

DoEvents '循环中交回工作权限给系统,以免"软死机"

Loop

这几行代码可以保证网页的加载完成,这是根据ie.ReadyState的返回值来判断的。


readyState一共有5中状态:

状态 含义 说明

0 未初始化 对象已建立,但是尚未初始化(尚未调用open方法)

1 初始化 对象已建立,尚未调用send方法

2 发送数据 send()方法已调用,但是当前的状态及http头未知

3 数据传送中 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误

4 数据接收完毕 此时可以通过通过responseBody和responseText获取完整的回应数据


通过以上的分析,我们可以看出,只用当.ReadyState=4时网页的数据才是有效的数据。

3 IE页面数据的获得

当网页加载完毕,剩下的工作就是从网页中抓取数据了,数据的抓取主要是利用控件对象的属性和方法。


1)用Set doc=ie.Document 取得网页的文档对象

从文档对象(Document)以下展开的对象模型,它代表网页的内容,和前面那个IE的应用程序不是同一个体系.

Documnet(文档)是文档对象模型,相当于OFFICE对象中的APPLICATION,取得Document之后,不论修改网页还是读写网页,还是触发事件,一切都好说,每个URL都对应有一个Documnet(这是假如定成功导航Navigate到那个URL完成,因此之前要求确定IE对象READSTATE,以确定对应URL的Document打开了)


2) 在Documnet之下可以取得documentElement和body两个节点。


可以用下面的语句:

set xbody=doc.Body '取得body对象

set xDoc=doc. documentElement '取得根节点

body前面已经说过,相当于标记的对象,根节点相当于网页中的标记元素的对象,MHTML的类型库定义里,它们都属于HTMLHtmlElement类型的对象,下面我把这种类型的对象称为一个"节点",不过要注意的是文档对象不是节点对象,它是HTMLDocument类型。根节点和body节点不同的是根节点包括整个网页,在HTML的文档对象模型中,这类对象有几种属性可以取得其中的内容:

对象.innerHtml '对象内部的HTML文本

对象.OuterHtml '对象中的HTML文本,包括对象本身的HTML标记在内

对象.innerText '对象内部的TEXT,不包括HTML标记

对象.OuterText '同上,包括对象本身的文本

所以,如果我们要抓取某个网站的所有HTML内容,代码可以这样写:

set doc=ie.Document

set xDoc=doc. documentElement '取得根节点

strX=xDoc.OuterHtml '取得所有的HTML内容


3) 每一个标记节点对象之下都有一个名为ChildNodes的集合,它包含了"直属于本节点下的标记",就象是文件目录,根目录下的子目录.

我们可以看到:HTML标记是文档的根节点,是Document的Childnodes集合中的一个成员(Document不是节点,是另一种类型对象,上一级文档,但它可以有下级节点集合,正如磁盘可以有下级目录,但它本身不是目录),BODY是根节点的ChildNodes集合中的一个成员,而DIV和P两个节点则是BODY的ChildNodes集合中的两个成员,同样也有自已的Childnoes集合。

我们要注意:文档对象模型中,集合与OFFICE的集合有所不同,集合是从0开始计数的,计数属性是Length而不是Count。


4)除了ChildNodes集合,大家在网页文档对象中还常见到的就是很大气的一种集合:All集合,这是"最糊涂"的一种集合,文档和各级节点都带有这个集合,正如这个名字所示,它是不分层次的,但用起来也很方便:

Set doc=ie.Document

Set xCols=doc.All '取得文档中的所有节点集合

Set xbCols=doc.body.All '取得body节点下所有的节点集合

虽然任何标记节点都有ALL集合,但我们还是喜欢用DOCUMENT的ALL,原因无它,文档最大,一锅烩的ALL找起来也最合适。ALL查找是有条件的:如果这个标记没有ID,你无法查到它的名字。


不过,ALL集合有一个很方便的特性:ID可以挂到ALL集合之下:

strX=doc.All.mytag.innerhtml


5)获得文档对象的getElementsByName集合,可以利用下面的方法:

set mydivs=doc. getElementsByName("div") '取得所有DIV标记,注意还是集合


6) 文档对象的FORMS集合,因为大部分网页的数据提交都是通过FORM标记提交的:

Set myForms=doc.Forms '取得所有的FORM标记

Set frmX=myForms.item(0) '第1个FORM

FORM标记节点代表的对象是很多朋友关心的内容——在网页对象中,它可以发送数据到服务器,使服务器刷新网页(实际上是服务器按某个格式约定发回数据),我们可以把网页的FORM看成是一个远程的函数调用接口,FORM标记中的ACTION指向的URL地址就是函数入口,而FORM标记内的各个INPUT标记节点就是函数的参数,当发出FORM.Submit方法时,就是远程调用函数了,在服务器端,诸如ASP,PHP就是老老实实找FORM的参数,不管你是用GET还是POST:

frmX.submit '相当于用户在页面上按下FORM的发送按键


上面我罗列了获取网页数据的一般的方法,并没有什么特别的使用要求,大家可以根据自己的习惯来利用,这个专题之后的内容就是灵活运用这些知识点来解决实际问题了。



本节知识点回向:


如何提交表单?如何下载图片的地址?如何获得表的数据?


积木编程的思路内涵:

在我的系列书籍中一直在强调"搭积木"的编程思路,这也是学习利用VBA的主要方法,特别是职场人员,更是要采用这种方案。其主要的内涵:

1 代码不要自己全部的录入。你要做的是把积木放在合适的位置然后去修正代码,一定要拷贝,从你的积木库中去拷贝,然后修正代码,把时间利用到高效的思考上。

2 建立自己的"积木库"。平时在学习过程中,把自己认为有用的代码放在一起,多积累,在用到的时候,可以随时拿来。你的积木库资料越多,你做程序的思路就会越广。

VBA的应用界定

VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对VBA的应用界定。在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!

我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了六部VBA专门教程:

第一套:VBA代码解决方案 是VBA中各个知识点的讲解,教程共147讲,覆盖绝大多数的VBA知识点,初学必备;

第二套:VBA数据库解决方案 数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,适合中级人员的学习。

第三套:VBA数组与字典解决方案 数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习,是初级及中级人员代码精进的手段。

第四套:VBA代码解决方案之视频 是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。这套教程是第一套教程的视频讲解,听元音更易接受。

第五套:VBA中类的解读和利用 这是一部高级教程,讲解类的虚无与肉身的度化,类的利用虽然较少,但仔细的学习可以促进自己VBA理论的提高。这套教程的领会主要是读者的领悟了,领悟一种佛学的哲理。

第六套教程:《VBA信息获取与处理》是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。

大家可以根据以上资料1→3→2→6→5或者是4→3→2→6→5的顺序逐渐深入的逐渐学习。教程提供讲解的同时提供了大量的积木,如需要可以WeChat: NZ9668


学习VBA是个过程,也需要经历一种枯燥的感觉

如太白诗云:众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。这些教程也是为帮助大家起航,助上我自己之力,我的上述教程是我多的经验的传递,

"水善利万物而不争",绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,用一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。茶,满也好,少也好,不要计较;浓也好,淡也好,其中自有值得品的味道。去感悟真实的时间,静下心,多学习,积累福报。而不是天天混日子,也不是天天熬日子。在后疫情更加严峻的存量残杀世界中,为自己的生存进行知识的储备,特别是新知识的储备。学习时微而无声,利用时则巨则汹涌。

每一分收获都是成长的记录,怎无凭,正是这种执着,成就了朝霞的灿烂。最后将一阙词送给致力于VBA学习的朋友,让大家感受一下学习过程的枯燥与执着:


浮云掠过,暗语无声,

唯有清风,惊了梦中啼莺。

望星,疏移北斗,

奈将往事雁同行。

阡陌人,昏灯明暗,

忍顾长亭。

多少VBA人,

暗夜中,悄声寻梦,盼却天明。

怎无凭!


回向学习利用VBA的历历往事,不胜感慨,谨以这些文字给大家,分享我多年工作实际经验的成果,随喜这些有用的东西,给确实需要利用VBA的同路人。


分享成果,随喜正能量