解析页面链接
本来想直接看sdk中的doc文档来学习android的,结果发现里面的英文资料,学起来速度有点慢,遂买了本android的教程书回来学习,刚好看到一个书里面一个使用java.net.URL访问网页的例子,之前在做采集的时候,使用了html解析器jsoup来获取页面所有链接,顺便试下把jsoup放进android中使用下,发现jsoup在android中能直接使用 ### 解析页面链接知识点 #### 一、使用Java与Jsoup进行页面链接解析 ##### 1. Jsoup简介 Jsoup 是一个用于处理实际世界 HTML 的 Java 库。它可以为 HTML 文档提供便利的 API 用于提取数据,即使 HTML 结构不完整或不符合标准。Jsoup 可以轻松地对 HTML 内容进行解析、提取数据、操作 DOM 或者通过 CSS 和 DOM 查询 API 来修改 HTML 内容。 ##### 2. 在Android中使用Jsoup 在Android开发中,开发者可能会遇到需要解析HTML页面的需求,比如抓取网页上的链接信息。Jsoup库可以在Android环境中直接使用,无需额外配置。例如,如果想要获取某个网页的所有链接,可以使用Jsoup进行简单的代码实现: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; // 加载HTML文档 Document doc = Jsoup.connect("http://example.com").get(); // 获取所有链接 Elements links = doc.select("a[href]"); for (Element link : links) { System.out.println("Found link: " + link.attr("href")); } ``` #### 二、Android中显示HTML内容 ##### 1. 使用TextView显示HTML文本 在Android中,有时候需要将HTML格式的文本显示在界面上,可以通过TextView组件配合Html类的方法来实现。例如,显示带有超链接的文本: ```java TextView mTVText = new TextView(context); CharSequence richText = Html.fromHtml("<strong>这是一个例子</strong>--<a href='http://orgcent.com'>点击这里</a>"); mTVText.setText(richText); // 使TextView支持点击超链接 mTVText.setMovementMethod(LinkMovementMethod.getInstance()); ``` 这里需要注意的是,为了使TextView能够响应超链接的点击事件,需要设置`LinkMovementMethod`。 ##### 2. 显示HTML中的图片和其他自定义标签 如果HTML中包含图片或者其他自定义标签,需要使用更复杂的处理方式。可以自定义一个`Html.TagHandler`来处理这些标签,并且使用`Html.ImageGetter`来加载图片。 ```java final String html = "<strong>这是一个例子</strong><img src='http://example.com/image.jpg'/><mytag color='blue'>自定义标签</mytag>"; // 自定义标签处理器 final Html.TagHandler tagHandler = new Html.TagHandler() { int contentIndex = 0; public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if ("mytag".equals(tag)) { if (opening) { // 开始标签位置 contentIndex = output.length(); try { final String color = (String) xmlReader.getProperty("color"); } catch (Exception e) { e.printStackTrace(); } } else { // 结束标签,处理内容 final int length = output.length(); String content = output.subSequence(contentIndex, length).toString(); SpannableString spanStr = new SpannableString(content); spanStr.setSpan(new ForegroundColorSpan(Color.BLUE), 0, content.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); output.replace(contentIndex, length, spanStr); } } } }; // 图片加载器 final Html.ImageGetter imageGetter = new Html.ImageGetter() { public Drawable getDrawable(String source) { Drawable d = null; try { InputStream is = new DefaultHttpClient().execute(new HttpGet(source)).getEntity().getContent(); Bitmap bm = BitmapFactory.decodeStream(is); d = new BitmapDrawable(bm); d.setBounds(0, 0, 200, 300); } catch (Exception e) { e.printStackTrace(); } return d; } }; CharSequence richText = Html.fromHtml(html, imageGetter, tagHandler); mTVText.setText(richText); ``` 以上示例展示了如何在Android中使用TextView显示包含图片和其他自定义标签的HTML内容。 #### 三、Android中解析XML数据 ##### 1. 使用SAX解析XML 在Android中,除了解析HTML之外,解析XML数据也是非常常见的需求。SAX(Simple API for XML)是一种基于事件驱动的解析方法,适用于大型XML文档的解析。 ```java import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; // 创建XMLReader对象 XMLReader reader = XMLReaderFactory.createXMLReader(); // 设置内容处理器 MyContentHandler handler = new MyContentHandler(); reader.setContentHandler(handler); // 解析XML reader.parse(new InputSource(new FileInputStream("file.xml"))); ``` ##### 2. SAX解析实例 这里给出一个简单的SAX解析XML的实例: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyContentHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); // 处理开始标签 System.out.println("Start element: " + qName); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); // 处理结束标签 System.out.println("End element: " + qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); // 处理元素内容 System.out.println("Characters: " + new String(ch, start, length)); } } ``` 这个例子中,我们创建了一个自定义的`DefaultHandler`子类来处理XML解析过程中的各种事件。当遇到开始标签、结束标签以及元素内容时,都会触发相应的处理方法。 通过以上知识点的学习,我们可以了解到在Android开发中如何使用Jsoup来解析HTML页面链接,如何使用TextView来展示HTML内容,以及如何使用SAX来解析XML数据。这些技能对于开发高质量的应用程序非常有帮助。