-
htmlparser怎样获取标签中的部分文字
2014-02-21 08:16:18各位大神,我想用java写个小工具,可以把论坛中连载的帖子中楼主发言的部分转为txt保存,目前在处理网页时遇到了点问题。 网页中部分代码: ```html 楼主帖子内容 本楼的回复内容 ``` 我想获取楼主... -
java 爬虫 网页解析(Jsoup)
2017-05-21 12:39:42上一篇演示了怎样使用HttpClient建立连接获取网页内容,接下来展示使用第三方开源分析工具Jsoup对获取到的网页进行分析,爬取需要的信息。上一篇演示了怎样使用HttpClient建立连接获取网页内容,接下来展示使用第三方开源分析工具Jsoup对获取到的网页进行分析,爬取需要的信息。
一、Jsoup
Jsoup是一款Java的HTML解析器,可以直接解析某个URI地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出需要的网页内容和信息。下载地址:http://jsoup.org/download
在使用Jsoup解析HTML文本文件前,需要对HTML文本格式有一些了解。如果你已经熟悉HTML直接跳到“二、解析过程”。一个HTML文本文档是由若干的标签组标记成,这些标签当中含有单标签和复标签,其中单标签不会再含有子标签,而复标签可以含有若干个子标签。基于这样的模型,整个HTML文档构成一棵DOM树,就文档来看(浏览器解析时根节点是document),这棵树的根标签是<html>。如下的HTML对应的DOM树:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" type="text/css" href="css/start.css" /> </head> <body> <div class="blank" ></div> <div class="header"> <div class="logo"> <img src="img/logo.png" alt="LOGO" /> </div> <div class="inputarea" > <form method="post" action="word"> <input class="inputtext" type="text" name="word" required="true" /> <button class="buttonsubmit" type="submit" >搜索一下</button> </form> </div> </div> <div class="footer"> <div class="swift"> <ul> <li><a href="###" >帮助</a></li> <li><a href="###" >联系我们</a></li> <li><a href="###" >关于我们</a></li> </ul> </div> <div class="label"> <span>信息检索实验</span> </div> </div> </body> </html>
除了理解HTML文档的DOM树模型外,还需要知道标签具有的特征。每一个标签具有自己的特有属性也具有通用属性。如<a>标签具有href特有属性,也含有class、id通用属性。另外就是一个class对应多个标签,而一个id最多对应一个标签,这在解析时是重要的。
二、解析过程
在解析之前需要区分两个对象Element和Elements对象,前者对应一个特定的标签,而后者是一个多标签的集合,该集合中的一个元素是一个Element对象,在解析过程中这两个对象不断的转换。
1、实例化文档对象,参数是一个HTML文本文档通常是String类型的HTML文档(如果需要可以是文件或输入流),这里使用上一篇文章 java HttpClient 爬虫中最后获得的entity对象。
String html=EntityUtils.toString(entity,CHARSET); //实例文档对象, Document document = Jsoup.parse(html);
2、通过标签名解析。Document和Element对象都提供了getElementsByTag(String tagName)方法,这个方法返回Document或Element下的所有标签名为tagName的标签集合。需要注意的是通过标签名解析时文档中或一个标签下含有多个同名标签。对应的对象是Elements。
//获得文档下所有div标签,返回的是一个标签的集合 Elements elements = document.getElementsByTag("div"); //定义一个标签对象 Element element=null; //从这一个标签集合中一个一个的取出 for (int i = 0; i < elements.size(); i++) { element= elements.get(i); } //不仅document可以取出所有的div标签,一个标签也可以取出它所有的div子标签 if(element!=null){ Elements newelements=element.getElementsByTag("div"); }
3、通过class属性解析。Document和Element对象都提供了getElementsByClass(String className)方法,这个方法返回Document或Element下的所有class通用属性为className的标签集合。需要注意的是通过class属性解析时文档中或一个标签下含有多个class属性相同的标签。对应的对象是Elements。
//获得文档下所有class属性为header的标签,返回的是一个标签的集合 Elements elements = document.getElementsByClass("header"); //定义一个标签对象 Element element=null; //从这一个标签集合中一个一个的取出 for (int i = 0; i < elements.size(); i++) { element= elements.get(i); } //一个标签也可以取出它所有class属性为header的子标签 if(element!=null){ Elements newelements=element.getElementsByTag("header"); }
4、通过id属性解析。Document和Element对象都提供了getElementsById(String id)方法,这个方法返回Document或Element下的一个id通用属性为id的标签。需要注意的是通过id属性解析时文档中或一个标签下最多含有一个id属性为id的标签。对应的对象是Element。
//获得文档下属性id为submit_button的标签 Element element=document.getElementById("submit_button"); //获得一个标签下属性id为submit_button的子标签 element=element.getElementById("submit_button");
5、通过子元素解析。Element对象提供了getAllElements()方法,这个方法返回Element下所有的子标签。另外还提供了child(index)方法,这个方法返回该标签中子标签索引为index的子标签,需要注意可能没有会报数组越界错误。
//获得文档下属性id为submit_button的标签 Element element=document.getElementById("main"); //获得标签的所有子标签 Elements elements=element.getAllElements(); //获得标签子标签索引为1个子标签,如果没有可能会报数组越界,因此捕获异常。 try{ element=element.child(1); }catch (Exception e){ e.printStackTrace(); }
6、解析属性。通过以上的步骤介绍了4中解析到标签或标签集合的方法。接下来就来解决怎样获得一个标签属性的值,Element对象提供了attr(String attributeKey)方法获取属性为attributeKey的属性值。
//获得文档下属性id为main的标签 Element element=document.getElementById("main"); //获得element标签的href属性的值, String href=element.attr("href");
7、文本解析。爬取网页很多时候需要的是网页上的文本,Element对象提供了text()方法获取该标签下(不仅是一层)的所有文本内容。
//获得文档下属性id为main的标签 Element element=document.getElementById("main"); //获得element标签下的所有文本 String text=element.text();
到这里基本上就能完成网页的爬虫,在网页的爬虫过程中结合使用上面6中解析方法就能很好的解析网页了。
-
java和js根据WSDL文档,怎样调用WebService?
2020-11-13 16:39:59作为一个java开发人员,当我们获取到了对方提供的wsdl地址,然后在网页上能够访问wsdl文档以后,如何调用对方的webservic借口呢? 一下有几种方法,可以参考一下。 第一种是 HttpURLConnection方式 第二种是 JSP页面...作为一个java开发人员,当我们获取到了对方提供的wsdl地址,然后在网页上能够访问wsdl文档以后,如何调用对方的webservic借口呢?
一下有几种方法,可以参考一下。
第一种是 HttpURLConnection方式
第二种是 JSP页面上纯JS调用
内容说明
1、WSDL文档基本说明
2、httpURLConnection方式调用
3、JS方式调用
4、获取的数据如何解析?
1、WSDL文档基本说明
接口文档如下:以下是公共对外开放的查询手机号归属地的一个借口文档:
WSDL:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
可以自己用浏览器打开访问一下;
一眼望去,可能接口看起来很复杂,较为繁琐。 但是作为开发人员,使用的时候, 我们可以查看关注点信息,就能实现接口的调用了!!那么我们需要了解吗哪些信息呢?
从上面的文档里面,我们需要从头部(最上面一行)了解到:
系统的targetNamespace=“http://WebXml.com.cn/”
从wsdl:types标签里的<s:element ></s:element>的name=“xxxxxxx”,获知该文档提供了两个方法:
getMobileCodeInfo、getDatabaseInfo(后面带Response的是对应方法的回复)
从底部的<wsdl:service name=“MobileCodeWS”></wsdl:service>标签里面,能获知<http:address location=“http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx”/>请求地址。
http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx一般而言,知悉以上信息,你就能调用借口了。需要传参数调用的,可能在业务上需要与对方了解一下,参数的格式(数据类型,文档里是可以知晓的)
2、httpURLConnection方式调用
代码如下:package com.ssh.webserviceTSY; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; public class Test { public static void main(String[] args) throws IOException { //第一步:创建服务地址 URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); //第二步:打开一个通向服务地址的连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //第三步:设置参数 //3.1发送方式设置:POST必须大写 connection.setRequestMethod("POST"); //3.2设置数据格式:content-type connection.setRequestProperty("content-type", "text/xml;charset=utf-8"); //3.3设置输入输出,因为默认新创建的connection没有读写权限, connection.setDoInput(true); connection.setDoOutput(true); //第四步:组织SOAP数据,发送请求 String soapXML = getXML("17321242779"); //将信息以流的方式发送出去 OutputStream os = connection.getOutputStream(); os.write(soapXML.getBytes()); //第五步:接收服务端响应,打印 int responseCode = connection.getResponseCode(); if(200 == responseCode){//表示服务端响应成功 //获取当前连接请求返回的数据流 InputStream is = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String temp = null; while(null != (temp = br.readLine())){ sb.append(temp); } /** * 打印结果 */ System.out.println(sb.toString()); is.close(); isr.close(); br.close(); } os.close(); } public static String getXML(String phone){ String soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2003/XMLSchema-instance\" " +"xmlns:web=\"http://WebXml.com.cn/\" " +"xmlns:xsd=\"http://www.w3.org/2003/XMLSchema\" " +"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +"<soap:Body>" +"<web:getMobileCodeInfo>" +phone +"</web:getMobileCodeInfo>" +"</soap:Body>" +"</soap:Envelope>"; return soapXML; } }
说明 :
一般的HTTP请求大部分都是相同的,但是由于webservice是基于soap协议的,所以,请求时的文本格式需要设置好。
文中的soapXML信息,需要注意xmlns:web=“tns” 这个xml命名空间, 这个空间是依据wsdl文档里的头部NameSpace信息,确定的
程序会依据这个名称,检索到该文档里面的方法,譬如:
<web: getDatabaseInfo> 获取getDatabaseInfo方法 (web是xmlns的名字,可以自定义,相当于“id”)3、JS方式调用
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Test WebService</title> <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script> <script> $(function(){ invoke(); back(); }); var xhr; function invoke(){ if(window.ActiveXObject){ xhr = new ActiveXObject("Microsoft.XMLHTTP"); }else{ xhr = new XMLHttpRequest(); } //指定请求地址 var url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"; //定义请求类型和地址和异步,一般都是post方式。 xhr.open("POST", url, true); //设置Content-Type xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8"); //指定回调方法 xhr.onreadystatechange = back; //组装消息体的数据 var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ' ' xmlns:web="http://WebXml.com.cn/" ' ' xmlns:xsd="http://www.w3.org/2003/XMLSchema" ' ' xmlns:xsi="http://www.w3.org/2003/XMLSchema-instance">' +'<soapenv:Body>' +'<web:getDatabaseInfo>' +'<data>' +'17321242719' +'</data>' +'</web:getDatabaseInfo>' +'</soapenv:Body>' +'</soapenv:Envelope>'; xhr.send(data); } function back(){ if(xhr.readyState == 4){ if(xhr.status == 200){ var doc = xhr.responseXML; alert(xhr.getAllResponseHeaders()); // xhr.getResponseBodyAsStream alert(xhr.responseText); } }/* else{ alert("请求失败") } */ } </script> </head> <body> </body> </html>
-
JAVA技术 J2EE实用技术集锦
2010-12-22 15:19:12java中怎样使用库中的文件(import 文件) JAVA专业术语集 JB4中文教程 Jbuider4新特性介绍 Jbuilder4.0 使用心得 JBuilder5 Weblogic 6.0 安装配置全攻略 JBuilder 4 概观 JBUILDER 5新增功能介绍 jBuiler 4... -
-
Java中Socket通信-服务端和客户端双向传输字符串实现
2020-09-09 14:10:35socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户...场景
什么是socket
在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。
那么在Java中怎样使用import java.net.Socket;来构建服务端和客户端并进行通信传输字符串?
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。实现
ServerSocket类能创建Socket(套接字)的服务端,Socket类能创建Socket的客户端。
在代码层面使用的方式就是使用Socket类去连接ServerSocket类,也就是客户端要主动连接服务端。
ServerSocket类中的public Socket accept()方法的作用是侦听并接受此套接字的连接。此方法在连接传人之前一直阻塞。public Socket accept()方法的返回值是Socket类型。
那么什么时候不阻塞呢?有客户端连接到服务端时就不再出现阻塞了,服务端的程序会继续运行。
除了ServerSocket类中的accept()方法具有阻塞特性外,InputStream类中的read()方法也同样具有阻塞特性。
通过使用Socket类的getlnputStream()方法可以获得输人流,从输人流中获取从对方发送过来的数据
客户端向服务端发送字符串数据
首先新建一个Java项目SocketServer作为服务端
然后编写其main方法,在main方法中调用接收并读取字符串的方法
package com.badao; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Main { public static void main(String[] args) { //接受并读取客户端发送的字符串 getStringFromClient(); } //接受并读取客户端发送的字符串 public static void getStringFromClient() { try { char[] charArray = new char[10]; //创建Socket服务端,开放端口8088 ServerSocket serverSocket = new ServerSocket(8088); System.out.println("accept begin = " + System.currentTimeMillis()); //调用accept方法,此时会堵塞 Socket socket = serverSocket.accept(); System.out.println("accept end =" + System.currentTimeMillis()); //获取客户端发送的数据的输入流 InputStream inputStream = socket.getInputStream(); //读取输入流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream); System.out.println("read begin =" + System.currentTimeMillis()); int readLength = inputStreamReader.read(charArray); while (readLength != -1) { String newString = new String(charArray, 0, readLength); System.out.println(newString); readLength = inputStreamReader.read(charArray); } System.out.println("read end =" + System.currentTimeMillis()); inputStreamReader.close(); inputStream.close(); socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
然后在新建一个Java项目SocketClient作为客户端,同样新建一个main方法,并在main方法中调用发送字符串数据
到服务端的方法
package com.badao; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class Main { public static void main(String[] args) throws IOException, InterruptedException { //客户端向服务端发送字符串 sendStringToServer(); } //客户端向服务端发送字符串 public static void sendStringToServer() throws IOException, InterruptedException { System.out.println("socket begin ="+System.currentTimeMillis()); //新建客户端并请求服务端的ip为localhost 端口为8088 Socket socket = new Socket("localhost",8088); System.out.println("socket end ="+System.currentTimeMillis()); //休眠3秒 Thread.sleep(3000); //获取客户端的输出流 即向服务端发送的数据 OutputStream outputStream = socket.getOutputStream(); //向输出流中写入要发送的字符串数据 outputStream.write("公众号:霸道的程序猿".getBytes()); outputStream.close(); socket.close(); } }
然后运行服务端的main方法
此时服务端会一直堵塞在accept方法这里,一直等待客户端发送数据。
然后运行客户端的main方法,实现客户端向服务端发动字符串数据,此时服务端接收到客户端的字符串数据
服务端向客户端发送数据
在服务端的项目中新建向客户端发送字符串数据的方法
//服务端向客户端发送字符串数据 public static void sendStringToClient() throws IOException { //新建Socket 服务端 并开放8088 端口 ServerSocket serverSocket = new ServerSocket(8088); System.out.println("server堵塞开始 =" + System.currentTimeMillis()); //获取socket Socket socket = serverSocket.accept(); System.out.println("server堵塞结束 ="+System.currentTimeMillis()); //socket发送数据 OutputStream outputStream = socket.getOutputStream(); outputStream.write("来自服务端-公众号:霸道的程序猿".getBytes()); outputStream.close(); socket.close(); serverSocket.close(); }
然后在main方法中取消运行上面的方法,改为运行此方法
public static void main(String[] args) throws IOException { //接受并读取客户端发送的字符串 //getStringFromClient(); //服务端向客户端发送字符串数据 sendStringToClient(); }
然后再客户端项目中新建接受服务端数据的方法
//客户端接收来自服务端的数据 public static void getStringFromServer() throws IOException { System.out.println("client连接准备就绪 =" + System.currentTimeMillis()); Socket socket = new Socket("localhost",8088); System.out.println("client连接成功结束 ="+System.currentTimeMillis()); char[] charArray = new char[10]; //获取客户端发送的数据的输入流 InputStream inputStream = socket.getInputStream(); //读取输入流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream); System.out.println("read begin =" + System.currentTimeMillis()); int readLength = inputStreamReader.read(charArray); while (readLength != -1) { String newString = new String(charArray, 0, readLength); System.out.println(newString); readLength = inputStreamReader.read(charArray); } System.out.println("read end =" + System.currentTimeMillis()); inputStreamReader.close(); inputStream.close(); socket.close(); }
然后在main方法中取消运行上面的方法,改为运行此方法。
首先运行服务端的main方法
此时服务端会堵塞,直接运行客户端的main方法启动客户端之后
-
深入体验JAVA Web开发内幕—核心基础.part1
2008-12-12 09:00:286.7 获取请求消息的实体内容 300 6.7.1 getInputStream与getReader方法 301 多学两招:使用ServletInputStream对象读取文本格式的实体内容 6.7.2 分析文件上传的请求消息结构 301 动手体验:分析文件上传的请求... -
UTF-8编码查看网页源码中文显示问题
2011-09-15 17:31:55最近一个网站使用JAVA SSH,全部采用UTF-8编码。 网页查看,前后台交互都没有问题, ...其中第二个li标签中的内容就是从数据库获取的,在网页上能正常显示出中文。 怎样才能查看源码也是以中文显示...最近一个网站使用JAVA SSH,全部采用UTF-8编码。
网页查看,前后台交互都没有问题,
但是用浏览器查看网页源码时发现:
除页面输入的中文外,所有从数据库中取出的中文全是显示UTF-8码,如下所示:
<li>类型:</li>
<li>pro/e 考试</li>
其中第二个li标签中的内容就是从数据库获取的,在网页上能正常显示出中文。
怎样才能查看源码也是以中文显示而不是UTF-8码?? -
-
XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解
2008-12-05 08:39:07在HTML中我们知道可以使用meta标识来定义网页的关键字,简介等,这些标识不会显示在网页中,但可以被搜索引擎搜索到,并影响搜索结果的排列顺序。 XML对这一原理进行了深化和扩展,用XML,你可以描述你的信息在... -
用Delphi实现Word文件的预览
2005-07-13 15:37:57而这并不影响网页的下载时间,因为在执行 applet 的时候,这部分内存是在本地机器上被分配的。除了作为网页本身的 HTML 文件的内容外,下载时间还取决于 applet 的 .class 文件的大小,以及在它执行时下载的图像或... -
-
-
-
-
PHP基础教程 是一个比较有价值的PHP新手教程!
2010-04-24 18:52:44传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP... -
-
PostgreSQL从入门到精通
2011-10-30 19:00:30本章最重要的内容是数据库无关,所以你从本章获取的知识能够让你在使用其他数据库时如鱼得水。当然,所有的用来说明的示例资源是用PostgreSQL来作为示例数据库。关于PostgreSQL的管理和数据库设计的习惯用法也将在本... -
这是一本专门讲解Java并发的书,涉及到各种锁、常见安全的集合类,基本就是将 JUC(java.util.concurrent包的简称)里所有的内容覆盖了一遍,看完你一定有收获。强烈推荐! 上面推荐的几本书可能不太容易读懂,建议...
-
asp.net知识库
2015-06-18 08:45:45利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL... -
Junit_Recipes中文教程
2011-05-31 10:19:1211.13测试你的JNDI目录中的内容 第12章测试web组件 12.1脱离容器测试会话数据的更新 12.2测试HTTP session数据对象的更新 12.3测试解析JSP 12.4测试对Velocity模板的解析 12.5测试一个JSP tag handler 12.6... -
-
ASP200问.EXE
2010-05-20 13:25:08159.如何打印Iframe中的内容 160.如何用ASP实现网络打印 161.如何用组件实现本地特定打印 162.如何在ASP程序中打印Excel报表 163.如何在ASP中调用Java类 164.如何在线压缩和解压缩WinRAR文件 第11章 综合开发 166.... -
AJAX学习 培训文档集合(主要介绍 AJAX基础及 DWR JQUERY 应用)
2009-11-20 10:18:00•优点:结构化,类似于java 的结构,清晰明了,底层用到了Jquery 的一些函数,使整合使用有了选择,最重要的一点是界面太让让人震撼了。 •缺点:太过复杂,整个界面的构造过于复杂。 AJAX会有怎样的未来? •AJAX... -
Struts原理、开发及项目实施
2007-05-08 14:28:13Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。 流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的... -
-
-
-