jsoup解析html神器
2015-08-12 11:48
645 查看
这里贴一下我用到的 Java工程的测试代码
如果做为爬虫很有必要从网页中下载图片到本地,那么我们利用jsoup来进行该操作,jsoup 是一个很不错的html解析器。下面是它的简介:
jsoup是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
jsoup的主要功能如下:
从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;
jsoup是基于MIT协议发布的,可放心使用于商业项目。
网页中下载图片需要这么两步操作
1.获取绝对路径
很多网页中用的是相对路径,因此获取图片的绝对路径很重要
方法一:我们就利用jsoup来获取
或者
2.第二步则就是下载图片
下面来介绍android中使用Jsoup异步解析网页的数据 请注意: 这里很容易遇到一个乱码的问题
配置文件:AndroidManifest.xml中加 权限 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
layout的布局文件
主要异步加载数据的代码
不要让昨天的沮丧 让今天的梦想安然失色成功的人总是修改方法而不修改目标
package com.javen.Jsoup; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class JsoupTest { static String url="http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html"; /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub BolgBody(); //test(); //Blog(); /* * Document doc = Jsoup.connect("http://www.oschina.net/") * .data("query", "Java") // 请求参数 .userAgent("I ’ m jsoup") // 设置 * User-Agent .cookie("auth", "token") // 设置 cookie .timeout(3000) // * 设置连接超时时间 .post(); */// 使用 POST 方法访问 URL /* * // 从文件中加载 HTML 文档 File input = new File("D:/test.html");Document doc * = Jsoup.parse(input,"UTF-8","http://www.oschina.net/"); */ } /** * 获取指定HTML 文档指定的body * @throws IOException */ private static void BolgBody() throws IOException { // 直接从字符串中输入 HTML 文档 String html = "<html><head><title> 开源中国社区 </title></head>" + "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>"; Document doc = Jsoup.parse(html); System.out.println(doc.body()); // 从 URL 直接加载 HTML 文档 Document doc2 = Jsoup.connect(url).get(); String title = doc2.body().toString(); System.out.println(title); } /** * 获取博客上的文章标题和链接 */ public static void article() { Document doc; try { doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/").get(); Elements ListDiv = doc.getElementsByAttributeValue("class","postTitle"); for (Element element :ListDiv) { Elements links = element.getElementsByTag("a"); for (Element link : links) { String linkHref = link.attr("href"); String linkText = link.text().trim(); System.out.println(linkHref); System.out.println(linkText); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 获取指定博客文章的内容 */ public static void Blog() { Document doc; try { doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html").get(); Elements ListDiv = doc.getElementsByAttributeValue("class","postBody"); for (Element element :ListDiv) { System.out.println(element.html()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
如果做为爬虫很有必要从网页中下载图片到本地,那么我们利用jsoup来进行该操作,jsoup 是一个很不错的html解析器。下面是它的简介:
jsoup是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
jsoup的主要功能如下:
从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;
jsoup是基于MIT协议发布的,可放心使用于商业项目。
网页中下载图片需要这么两步操作
1.获取绝对路径
很多网页中用的是相对路径,因此获取图片的绝对路径很重要
方法一:我们就利用jsoup来获取
Element image = document.select( "img" ).first(); |
String url = image.absUrl( "src" ); |
// url = http://www.example.com/images/chicken.jpg[/code] |
String url = image.attr( "abs:src" ); |
他们的前提利用connect方式获取而不是文件方式 |
Document doc = Jsoup.connect( "http://jsoup.org" ).get(); |
Element link = doc.select( "a" ).first(); |
String relHref = link.attr( "href" ); // == "/" |
String absHref = link.attr( "abs:href" ); // "http://jsoup.org/" |
方法二:利用jdk中url |
URL url = new URL( http://www.example.com/index.html ); |
URI uri = url.toURI(); |
System.out.println(uri.resolve( "images/chicken.jpg" ).toString()); |
URL url = new URL( "图片地址" ); |
URLConnection uc = url.openConnection(); |
InputStream is = uc.getInputStream(); |
File file = new File( "本地路径 " ); |
FileOutputStream out = new FileOutputStream(file); |
int i= 0 ; |
while ((i=is.read())!=- 1 ) { |
out.write(i); |
} |
is.close(); |
配置文件:AndroidManifest.xml中加 权限 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
layout的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <WebView android:id="@+id/webView" android:layout_width="fill_parent" android:layout_height="200dp" /> <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </ScrollView> </LinearLayout>
主要异步加载数据的代码
package com.javen.aaa; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.webkit.WebView; import android.widget.TextView; public class MainActivity extends Activity { private WebView webView; private TextView textView; private static final int DIALOG_KEY = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); webView = (WebView) findViewById(R.id.webView); textView=(TextView) findViewById(R.id.textView); try { ProgressAsyncTask asyncTask=new ProgressAsyncTask(webView,textView); asyncTask.execute(10000); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String test() { StringBuffer buffer=new StringBuffer(); Document doc; try { doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/").get(); Elements ListDiv = doc.getElementsByAttributeValue("class","postTitle"); for (Element element :ListDiv) { Elements links = element.getElementsByTag("a"); for (Element link : links) { String linkHref = link.attr("href"); String linkText = link.text().trim(); buffer.append("linkHref=="+linkHref); buffer.append("linkText=="+linkText); System.out.println(linkHref); System.out.println(linkText); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return buffer.toString(); } // 弹出"查看"对话框 @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_KEY: { ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage("获取数据中 请稍候..."); dialog.setIndeterminate(true); dialog.setCancelable(true); return dialog; } } return null; } public static String readHtml(String myurl) { StringBuffer sb = new StringBuffer(""); URL url; try { url = new URL(myurl); BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(), "gbk")); String s = ""; while ((s = br.readLine()) != null) { sb.append(s + "\r\n"); } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } class ProgressAsyncTask extends AsyncTask<Integer, Integer, String> { private WebView webView; private TextView textView; public ProgressAsyncTask(WebView webView,TextView textView) { super(); this.webView=webView; this.textView=textView; } /** * 这里的Integer参数对应AsyncTask中的第一个参数 这里的String返回值对应AsyncTask的第三个参数 * 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改 * 但是可以调用publish Progress方法触发onProgressUpdate对UI进行操作 */ @Override protected String doInBackground(Integer... params) { String str =null; Document doc = null; try { // String url ="http://www.cnblogs.com/zyw-205520/p/3355681.html"; // // doc= Jsoup.parse(new URL(url).openStream(),"utf-8", url); // //doc = Jsoup.parse(readHtml(url)); // //doc=Jsoup.connect(url).get(); // str=doc.body().toString(); doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html").get(); Elements ListDiv = doc.getElementsByAttributeValue("class","postBody"); for (Element element :ListDiv) { str=element.html(); System.out.println(element.html()); } Log.d("doInBackground", str.toString()); System.out.println(str); //你可以试试GBK或UTF-8 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return str.toString() ; //return test(); } /** * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值) * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置 */ @Override protected void onPostExecute(String result) { webView.loadData(result, "text/html;charset=utf-8", null); textView.setText(result); removeDialog(DIALOG_KEY); } // 该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置 @Override protected void onPreExecute() { showDialog(DIALOG_KEY); } /** * 这里的Intege参数对应AsyncTask中的第二个参数 * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行 * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作 */ @Override protected void onProgressUpdate(Integer... values) { } } }
不要让昨天的沮丧 让今天的梦想安然失色成功的人总是修改方法而不修改目标
相关文章推荐
- javaScript中表单的验证
- D3.js以及通用JS(JavaScript)读取并解析服务器端JSON的注意事项
- js获取当前域名、Url、相对路径和参数
- 在C#中调用VBScript和JavaScript等脚本的实现
- javascript实现点击单选按钮链接转向对应网址的方法
- FastJson生成和解析JSON数据
- JavaScript设计模式与开发实践
- 02_08 JSP内置对象之Web安全性及config对象
- JSON的三种解析方式
- javascript代码是否有保密性?
- javascript后台运行效率是否比较低?
- js获取图片原始大小
- JavaScript技巧手册
- JavaScript 函数 对象 数组
- JavaScript 函数 对象 数组
- 在项目中使用ExtJS
- JavaScript多线程详解
- 如何在servlet中将数据封装成JSON格式之后传到前台
- extjs type类型
- javascript实现在下拉列表中显示多级树形菜单的方法