java Jsoup XPath 提取模块详细解释

# java Jsoup XPath 提取模块详细解释

## 什么是 Jsoup?
Jsoup 是一个 Java 的 HTML 解析器,可以从一个 URL、文件或字符串中解析 HTML。它提供了类似 jQuery 的选择器语法,可以很方便地提取和操作网页中的 HTML 元素。

## XPath 与 Jsoup
虽然 Jsoup 支持 CSS 选择器语法,但是它并不直接支持 XPath 查询。然而,你可以通过 Jsoup 提供的选择器和方法来模拟 XPath 的一些功能,常见的选择器有:`select()`, `get()`, `text()`, `attr()` 等。

## 1. 初始化 Jsoup
首先,你需要引入 Jsoup 库。可以通过 Maven 或 Gradle 来集成 Jsoup。

### Maven:
```xml
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.15.2</version>
</dependency>

Gradle:

implementation 'org.jsoup:jsoup:1.15.2'

示例:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) throws Exception {
        String url = "https://example.com";
        Document document = Jsoup.connect(url).get();

        // 获取页面标题
        String title = document.title();
        System.out.println("Title: " + title);
    }
}

2. Jsoup 提取方法

2.1 select()

select() 方法用来通过 CSS 选择器提取元素,类似于 XPath 中的路径查询。它返回的是一个 Elements 对象,可以通过索引访问具体的元素。

示例:
Elements links = document.select("a[href]");  // 提取所有链接
for (Element link : links) {
    System.out.println(link.attr("href"));
}
选择器支持:
  • * 选择所有元素
  • .className 选择指定类名的元素
  • #id 选择指定 ID 的元素
  • element > child 选择直接子元素
  • element child 选择所有子元素
  • element + sibling 选择紧邻的兄弟元素
  • element ~ sibling 选择之后所有兄弟元素

2.2 text()

text() 用来提取文本内容,相当于 XPath 中的 text() 函数。

示例:
String text = document.select("p").text();  // 获取所有 <p> 标签的文本
System.out.println(text);

2.3 attr()

attr() 用来提取指定属性的值。相当于 XPath 中的 @attribute

示例:
String href = document.select("a").attr("href");  // 提取 <a> 标签的 href 属性
System.out.println(href);

2.4 get()

get() 方法获取单个元素,通常用于根据 CSS 选择器提取一个元素。

示例:
Element link = document.select("a[href]").get(0);  // 获取第一个 <a> 标签
System.out.println(link.attr("href"));

2.5 first()last()

这两个方法可以用来获取符合条件的第一个或最后一个元素。

示例:
Element firstLink = document.select("a[href]").first();  // 获取第一个链接
System.out.println(firstLink.attr("href"));

2.6 size()

size() 返回符合条件的元素数量,相当于 XPath 中的 count()

示例:
int numLinks = document.select("a[href]").size();  // 获取所有链接的数量
System.out.println(numLinks);

2.7 parents()children()

parents() 获取元素的所有父元素,children() 获取元素的所有子元素。

示例:
Elements parents = document.select("a").parents();
for (Element parent : parents) {
    System.out.println(parent.tagName());
}

2.8 siblings()

siblings() 获取元素的所有兄弟元素。

示例:
Elements siblings = document.select("a").siblings();
for (Element sibling : siblings) {
    System.out.println(sibling.tagName());
}

3. 其他常用方法

3.1 html()

html() 获取或设置元素的 HTML 内容。

示例:
String htmlContent = document.select("div.content").html();  // 获取内容
System.out.println(htmlContent);

3.2 val()

val() 获取或设置输入元素的值。

示例:
String inputValue = document.select("input[name='username']").val();  // 获取输入框的值
System.out.println(inputValue);

3.3 hasClass()

hasClass() 判断元素是否具有指定的类。

示例:
boolean hasClass = document.select("div").hasClass("active");
System.out.println(hasClass);

4. 模拟 XPath 操作

虽然 Jsoup 不直接支持 XPath,但是可以通过 CSS 选择器的组合来实现类似 XPath 的查询。例如:

  • XPath //a[@href='example.com'] 可以用 select("a[href='example.com']") 实现。
  • XPath /html/body/div 可以用 select("body > div") 实现。

5. 总结

  • select():通过 CSS 选择器来提取元素,灵活且强大。
  • text():提取文本内容。
  • attr():提取元素的属性值。
  • first()last():提取第一个或最后一个元素。
  • html():获取或设置元素的 HTML 内容。

Jsoup 提供了一种简洁且高效的方式来解析和操作 HTML 内容,并且能够用类似 XPath 的方法进行元素提取。

JsoupXpath 是一款纯Java开发的使用xpath解析html的解析器,xpath语法分析与执行完全独立,html的DOM树生成借助Jsoup,故命名为JsoupXpath.为了在java里也享受xpath的强大与方便但又苦于找不到一款足够强大的xpath解析器,故开发JsoupXpathJsoupXpath的实现逻辑清晰,扩展方便,支持几乎全部常用的xpath语法.http://www.cnblogs.com/ 为例 "//a/@href"; "//div[@id='paging_block']/div/a[text()='Next >']/@href"; "//div[@id='paging_block']/div/a[text()*='Next']/@href"; "//h1/text()"; "//h1/allText()"; "//h1//text()"; "//div/a"; "//div[@id='post_list']/div[position()1000]/div/h3/allText()"; //轴支持 "//div[@id='post_list']/div[self::div/div/div/span[@class='article_view']/a/num()>1000]/div/h3/allText()"; "//div[@id='post_list']/div[2]/div/p/preceding-sibling::h3/allText()"; "//div[@id='post_list']/div[2]/div/p/preceding-sibling::h3/allText()|//div[@id='post_list']/div[1]/div/h3/allText()"; 在这里暂不列出框架间的对比了,但我相信,你们用了会发现JsoupXpath就是目前市面上最强大的的Xpath解析器。 快速开始 如果不方便使用maven,可以直接使用lib下的依赖包跑起来试试,如方便可直接使用如下dependency(已经上传至中央maven库,最新版本0.1.1):    cn.wanghaomiao    JsoupXpath    0.1.1 依赖配置好后,就可以使用如下例子进行体验了!String xpath="//div[@id='post_list']/div[./div/div/span[@class='article_view']/a/num()>1000]/div/h3/allText()";String doc = "..."; JXDocument jxDocument = new JXDocument(doc); List<Object> rs = jxDocument.sel(xpath); for (Object o:rs){     if (o instanceof Element){             int index = ((Element) o).siblingIndex();             System.out.println(index);     }     System.out.println(o.toString()); } 其他可以参考 cn.wanghaomiao.example包下的例子 语法 支持标准xpath语法(支持谓语嵌套),支持全部常用函数,支持全部常用轴,去掉了一些标准里面华而不实的函数和轴,下面会具体介绍。语法可以参考http://www.w3school.com.cn/xpath/index.asp 关于使用Xpath的一些注意事项 非常不建议直接粘贴Firefox或chrome里生成的Xpa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值