jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。请参考:http://jsoup.org/
jsoup的主要功能如下:
从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;
jsoup是基于MIT协议发布的,可放心使用于商业项目。
下载和安装:
maven安装方法:
把下面放入pom.xml下
<dependency>
<!-- jsoup HTML parser library @ http://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.5.2</version>
</dependency>
用jsoup解析html的方法如下:
解析url html方法
Document doc = Jsoup.connect("http://example.com") .data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.post();
从文件中解析的方法:
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
类试js jsoup提供下面方法:
getElementById(String id) 用id获得元素
getElementsByTag(String tag) 用标签获得元素
getElementsByClass(String className) 用class获得元素
getElementsByAttribute(String key) 用属性获得元素
同时还提供下面的方法提供获取兄弟节点:
siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling()
用下面方法获得元素的数据:
attr(String key) 获得元素的数据
attr(String key, String value) t设置元素数据
attributes() 获得所以属性
id(), className() classNames() 获得id class得值
text()获得文本值
text(String value) 设置文本值
html() 获取html
html(String value)设置html
outerHtml() 获得内部html
data()获得数据内容
tag() 获得tag 和 tagName() 获得tagname
操作html提供了下面方法:
append(String html), prepend(String html)
appendText(String text), prependText(String text)
appendElement(String tagName), prependElement(String tagName)
html(String value)
通过类似jquery的方法操作html
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
Elements links = doc.select("a[href]"); // a with href
Elements pngs = doc.select("img[src$=.png]");
// img with src ending .png
Element masthead = doc.select("div.masthead").first();
// div with class=masthead
Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
支持的操作有下面这些:
tagname 操作tag
ns|tag ns或tag
#id 用id获得元素
.class 用class获得元素
[attribute] 属性获得元素
[^attr]: 以attr开头的属性
[attr=value] 属性值为value
[attr^=value], [attr$=value], [attr*=value]
[attr~=regex]正则
*:所以的标签
选择组合
el#id el和id定位
el.class e1和class定位
el[attr] e1和属性定位
ancestor child ancestor下面的child
等等
抓取网站标题和内容及里面图片的事例:
public void parse(String urlStr) { // 返回结果初始化。 Document doc = null; try { doc = Jsoup .connect(urlStr) .userAgent( "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.15)") // 设置User-Agent .timeout(5000) // 设置连接超时时间 .get(); } catch (MalformedURLException e) { log.error( e); return ; } catch (IOException e) { if (e instanceof SocketTimeoutException) { log.error( e); return ; } if(e instanceof UnknownHostException){ log.error(e); return ; } log.error( e); return ; } system.out.println(doc.title()); Element head = doc.head(); Elements metas = head.select("meta"); for (Element meta : metas) { String content = meta.attr("content"); if ("content-type".equalsIgnoreCase(meta.attr("http-equiv")) && !StringUtils.startsWith(content, "text/html")) { log.debug( urlStr); return ; } if ("description".equalsIgnoreCase(meta.attr("name"))) { system.out.println(meta.attr("content")); } } Element body = doc.body(); for (Element img : body.getElementsByTag("img")) { String imageUrl = img.attr("abs:src");//获得绝对路径 for (String suffix : IMAGE_TYPE_ARRAY) { if(imageUrl.indexOf("?")>0){ imageUrl=imageUrl.substring(0,imageUrl.indexOf("?")); } if (StringUtils.endsWithIgnoreCase(imageUrl, suffix)) { imgSrcs.add(imageUrl); break; } } } }这里重点要提的是怎么获得图片或链接的决定地址:
如上获得绝对地址的方法String imageUrl = img.attr("abs:src");//获得绝对路径 ,前面添加abs:jsoup就会获得决定地址;
想知道原因,咱们查看下源码,如下:
//该方面是先从map中找看是否有该属性key,如果有直接返回,如果没有检查是否 //以abs:开头 public String attr(String attributeKey) { Validate.notNull(attributeKey); if (hasAttr(attributeKey)) return attributes.get(attributeKey); else if (attributeKey.toLowerCase().startsWith("abs:")) return absUrl(attributeKey.substring("abs:".length())); else return ""; }接着查看absUrl方法:
/** * Get an absolute URL from a URL attribute that may be relative (i.e. an <code><a href></code> or * <code><img src></code>). * <p/> * E.g.: <code>String absUrl = linkEl.absUrl("href");</code> * <p/> * If the attribute value is already absolute (i.e. it starts with a protocol, like * <code>http://</code> or <code>https://</code> etc), and it successfully parses as a URL, the attribute is * returned directly. Otherwise, it is treated as a URL relative to the element's {@link #baseUri}, and made * absolute using that. * <p/> * As an alternate, you can use the {@link #attr} method with the <code>abs:</code> prefix, e.g.: * <code>String absUrl = linkEl.attr("abs:href");</code> * * @param attributeKey The attribute key * @return An absolute URL if one could be made, or an empty string (not null) if the attribute was missing or * could not be made successfully into a URL. * @see #attr * @see java.net.URL#URL(java.net.URL, String) */ //看到这里大家应该明白绝对地址是怎么取的了 public String absUrl(String attributeKey) { Validate.notEmpty(attributeKey); String relUrl = attr(attributeKey); if (!hasAttr(attributeKey)) { return ""; // nothing to make absolute with } else { URL base; try { try { base = new URL(baseUri); } catch (MalformedURLException e) { // the base is unsuitable, but the attribute may be abs on its own, so try that URL abs = new URL(relUrl); return abs.toExternalForm(); } // workaround: java resolves '//path/file + ?foo' to '//path/?foo', not '//path/file?foo' as desired if (relUrl.startsWith("?")) relUrl = base.getPath() + relUrl; URL abs = new URL(base, relUrl); return abs.toExternalForm(); } catch (MalformedURLException e) { return ""; } } }
相关推荐
以下是一个简单的Jsoup使用示例,用于获取网页的标题: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class JsoupExample { public static void main(String[] args) throws ...
**Jsoup解析与使用** Jsoup是一款非常实用的Java库,专为网页抓取和解析而设计。它提供了丰富的API,使得开发者可以方便地提取结构化数据,类似于浏览器执行JavaScript的方式,但更专注于HTML文档的处理。Jsoup的...
JSoup使用DOM解析器将HTML内容转换为一个可操作的`Document`对象。这个对象遵循W3C DOM规范,允许我们像操作XML一样操作HTML。你可以通过CSS选择器选择元素,就像在jQuery中那样: ```java Elements links = doc....
无论是从字符串、URL还是本地文件中加载HTML,还是使用DOM或CSS选择器提取数据,jsoup都能提供简洁、高效的解决方案。对于任何需要解析和操作HTML的Java项目而言,jsoup都是一个不可或缺的强大助手。
在实际项目中,开发者通常会将 `jsoup-1.9.2.jar` 添加到项目的类路径中,然后就可以通过导入 `org.jsoup.*` 包来使用 jsoup 的功能。如果遇到任何问题,官方文档、社区支持以及 `说明.txt` 文件都是很好的参考资料...
jsoup使用了基于CSS选择器的API,这使得选取HTML元素变得相当直观。你可以通过类名、ID、属性等来定位元素,例如: ```java Document doc = Jsoup.connect("http://example.com").get(); Element header = doc....
1. **连接与解析**:JSoup使用`Jsoup.connect()`方法建立HTTP连接,并通过`get()`或`post()`方法发送请求。之后,调用`parse()`方法解析返回的HTML文档。 ```java Document doc = Jsoup.connect(...
- 练习编写简单的爬虫,使用 JSoup 解析和提取数据。 - 结合 CSS 选择器进行元素定位,提高对 HTML 结构的理解。 - 实践修改 HTML 元素,体验如何动态构建或更新页面内容。 总之,JSoup 是一个强大且易用的工具,...
- **解析速度快**:jsoup使用高效的CSS选择器引擎,能快速定位网页元素。 - **HTML容错性**:jsoup能够处理不规范的HTML,使解析过程更加稳定。 - **安全的链接提取**:提供`absUrl()`方法确保提取的链接是绝对路径...
jsoup使用时记得导入jar,否则会报错.jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。主要功能 1....
在使用Jsoup时,应适当地捕获和处理这些异常。 通过阅读`jsoup-1.6.2-javadoc`中的文档,开发者可以深入理解每个类、方法和接口的具体用法,从而充分利用Jsoup的功能,进行高效的HTML处理和解析。无论是爬虫项目...
`Document` 是 Jsoup 的核心对象,可以使用 DOM 遍历方法(如 `childNodes()`, `select()`, `getElementById()` 等)来访问和遍历其内部的元素和文本节点。 2. 解析一个 HTML 字符串: 如果 HTML 字符串来自用户...
以下是一个简单的Jsoup使用示例,演示如何获取和打印网页的标题: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class JsoupExample { public static void main(String[] args) ...
- **DOM解析**:JSoup使用DOM解析方式,将HTML文档转化为一个可操作的Element树形结构。这种解析方式允许开发者通过CSS选择器或DOM遍历方法来查找、修改和删除HTML元素。 - **连接与下载**:JSoup不仅用于解析本地...
以下是一个简单的jsoup使用示例,展示如何解析HTML并提取标题: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class JsoupExample { public static void main(String[] args) ...
- jsoup使用DOM解析器来构建HTML文档的树形结构,允许开发者通过CSS选择器轻松访问元素。 - 它支持HTML5和一些常见的错误容忍,这意味着即使在处理不规范的HTML时,jsoup也能正常工作。 - 解析过程包括了解析HTML...
以下是一个简单的jsoup使用示例,展示如何解析HTML并提取页面标题: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class JsoupExample { public static void main(String[] args) ...
jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jar,jsoup-1.15.3.jarjsoup-...
#### 三、Jsoup 的使用案例 ##### 3.1 解析 HTML 字符串 **问题**:当需要解析来自用户输入、文件或网站的 HTML 字符串时,可以通过 Jsoup 来获取其内容、验证格式或修改内容。 **解决方法**: ```java String ...
**使用Jsoup获取网页内容并修改** Jsoup是一款强大的Java库,它允许开发者方便地解析、操作和提取HTML内容。在Android开发中,Jsoup常用于网页数据抓取和页面内容的处理。以下将详细解释如何使用Jsoup来实现这个...