当前位置: 首页 > 知识库问答 >
问题:

使用Java反射的Jsoup

束飞捷
2023-03-14

我想动态调用jsoup中的一个方法。这里是我的用例,我实际上在jsoup中调用多个select dom方法来遍历内部,

Document doc = Jsoup.connect("http://test.com").get();
String companyName = doc.select("div[class=\"_name\"]").select("span[class="\_name\"]").text();

我能实现同样的动态像,

Document doc = Jsoup.connect("http://test.com").get();
String pattern = "select("div[class=\"_name\"]").select("span[class="\_name\"]").text()";
String companyName = doc.pattern;

我知道我们可以使用反射来实现,但不确定如何实现这种行为,因为模式字符串将是动态的,并且可能有n个dom选择器。

让我知道如果上面的动力是可能的。

共有2个答案

史骏祥
2023-03-14

如果您只想支持n个dom选择器,那么您实际上不需要反射,因为您可以将它们组合在单个选择器字符串中:

Document doc = Jsoup.connect("http://test.com").get();
String pattern = "div[class=\"_name\"] span[class=\"_name\"]"; // Just separate with spaces
String companyName = doc.select(pattern).text();
王棋
2023-03-14

是的,这是可能的,您所要做的就是重复调用Document对象select()方法,直到枚举了所有的选择器,然后调用text()方法。

您甚至可以将所有选择器连接在一个中,因为select(div[class=foo]).select(span[class=bar]).text()等同于select(div[class=foo]span[class=bar]).text()可以简化为select(div.foospan.bar).text()

因此,您甚至可以放弃整个反射的东西,并动态地创建一个正确的、直接的选择器来满足您的需要。

  Document doc = Jsoup.connect("http://test.com").get();
  String companyName = doc.select("div.foo span.bar").text();

这是在使用链接:

Document doc = Jsoup.connect("http://test.com").get();
List<String> criterias = Arrays.asList("div.foo", "span.bar");
Document tmpDoc = doc;
for (String criteria: criterias) {
    if (tmpDoc != null)
        tmpDoc = tmpDoc.select(criteria);
}
// now you have traversed the whole criterias just get the text
String companyName = tmpDoc.text();

否则,使用反射也是一样的:

Document doc = Jsoup.connect("http://test.com").get();
List<String> criterias = Arrays.asList("div.foo", "span.bar");
Method select = doc.getClass().getMethod("select", String.class);
Document tmpDoc = doc;
for (String criteria: criterias) {
    if (tmpDoc != null)
        tmpDoc = (Document)select.invoke(tmpDoc, new Object[] {criteria});
}
// now you have traversed the whole criterias just get the text
String companyName = tmpDoc.text();
 类似资料:
  • 问题内容: 前几天,我通过手动将类的每个元素写成String来为Java中的类编写toString(),我想到使用反射可能可以创建一个通用的toString()方法在所有课程上。IE浏览器将找出字段名称和值,并将其发送到字符串。 获取字段名称非常简单,这是同事提出的: 使用工厂,我可以通过在第一次调用toString()时存储一次字段来减少性能开销。但是,找到这些值可能会贵得多。 由于反射的作用,

  • 问题内容: 我试图在我创建的特定Java类对象上列出方法列表,并尝试对其进行单元测试。 它无法说无法找到带有“ java.lang.ClassNotFoundException:类com.jr.freedom.user.User”的类。 这是测试代码: 我的项目包如下所示: 在项目文件夹中:src test User类位于src> com> jr?freedom> user(代表com.jr.fr

  • 本小节我们来学习一个 Java 语言中较为深入的概念 —— 反射(reflection),很多小伙伴即便参与了工作,可能也极少用到 Java 反射机制,但是如果你想要开发一个 web 框架,反射是不可或缺的知识点。本小节我们将了解到 什么是反射,反射的使用场景,不得不提的 Class 类,如何通过反射访问类内部的字段、方法以及构造方法等知识点。 1. 什么是反射 Java 的反射(reflecti

  • 问题内容: 是否有与.NET Reflector等效的Java ? 编辑:更具体地说,反编译是我的追求。 问题答案: 我几乎不知道.NET Reflector的功能在包括Eclipse在内的几乎所有Java IDE中都可用。只需将文件添加到项目中,就可以像浏览自己的类一样浏览其类。 对于反编译器方面(与纯类浏览器相反),还有一些替代方法。JDK工具仅反编译为字节码,因此获取源代码并没有什么用(但是

  • 问题内容: 我需要使用反射调用类的setter方法,并且代码如下: 的是一个以及设置器方法如下: 运行此代码时,将引发A ,但是将setter方法参数类型更改为from时,将执行正常。有没有一种方法可以将setter方法的参数保持为超级类型,并且在从类中获取方法时仍无需手动指定参数的类型即可使用反射? 问题答案: 与其他答案相反,有一个非常简单的解决方案。请参阅。它为您提供了一种执行任意反射代码的

  • 本文向大家介绍Java中反射的一个简单使用,包括了Java中反射的一个简单使用的使用技巧和注意事项,需要的朋友参考一下 简介 首先介绍一些不太实用的解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 简单使用 反射,在java中是非常常见和好用