【问题标题】:How to find the html element of a given text如何找到给定文本的html元素
【发布时间】:2017-02-20 09:32:45
【问题描述】:

假设我有以下代码要使用 JSoup 解析

<body> 
  <div id="myDiv" class="simple" >
    <p>
	  <img class="alignleft" src="myimage.jpg" alt="myimage" />
	  I just passed out of UC Berkeley
    </p>
  </div> 
</body>

问题是,仅给定一个关键字“Berkeley”,是否有更好的方法可以在包含此关键字的 html 中找到元素/XPath(或它的列表,如果该关键字多次出现)作为其文本的一部分。

我无法事先查看 html,并且仅在运行时可用。

我目前的实现 - 使用 Java-Jsoup,遍历 body 的孩子,并获取每个孩子的“ownText”和文本,然后深入到他们的孩子以缩小 html 元素。我觉得这很慢。

【问题讨论】:

  • 如果关键字只是文本字段的一部分,而不是 html 标记中的一部分,那么我认为您必须搜索文本字段,除非有关键字出现的模式(例如。出现在 "myDiv""alignleft")
  • 您是否只是想获取所有可能包含关键字“berkley”的元素?
  • @NickBell - 关键字将成为文本字段的一部分,并且无法识别任何模式,因为 html 将是动态的并且无法预测格式。
  • @testerjoe2 - 是的
  • 然后查看 giles 的回答。只需使用他回答的这一部分 - //*[contains(normalize-space(), "Berkeley")]

标签: java html xpath jsoup html-parsing


【解决方案1】:

试试这个

对于第一个带有 class 的元素:

'//*[contains(normalize-space(), "Berkeley")]/ancestor::*[@class]'

对于第一个带有 id 的元素:

'//*[contains(normalize-space(), "Berkeley")]/ancestor::*[@id]'

查看normalize-space

【讨论】:

  • 添加了 xpath sn-p,花了我一些时间 ;)
  • 我的问题集中在使用 XPath 或其他方法获取 Java/Jsoup 解决方案。我尝试将您的 XPath 集成到 XSoup (JSoup + XPath) 中,如下所示 Document doc = Jsoup.parse(html); &lt;br/&gt; String result = Xsoup.compile("//*[contains(normalize-space(), \"Berkeley\")]/ancestor::*[@class]").evaluate(doc).get();
    解析异常
  • 我的 Xpath 是有效的,其余的,我想你必须搜索一下。也许再问一个关于如何使用 Jsoup 来使用这个复杂的 XPath 的问题?!​​
【解决方案2】:

不优雅但简单的方法可能看起来像:

import java.util.HashSet;
import java.util.Set;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Tag;
import org.jsoup.select.Elements;

public class JsoupTest {

    public static void main(String argv[]) {
        String html = "<body> \n" +
                      "  <div id=\"myDiv\" class=\"simple\" >\n" +
                      "    <p>\n" +
                      "   <img class=\"alignleft\" src=\"myimage.jpg\" alt=\"myimage\" />\n" +
                      "   I just passed out of UC Berkeley\n" +
                      "    </p>\n" +
                      "    <ol>\n" +
                        "    <li>Berkeley</li>\n" +
                        "    <li>Berkeley</li>\n" +
                      "    </ol>\n" +
                      "  </div> \n" +
                      "</body>";
        Elements eles = Jsoup.parse(html).getAllElements(); // get all elements which apear in your html
        Set<String> set = new HashSet<>(); 
        for(Element e : eles){
           Tag t = e.tag();
           set.add(t.getName());  // put the tag name in a set or list
        }
        set.remove("head"); set.remove("html"); set.remove("body"); set.remove("#root"); set.remove("img");  //remove some unimportant tags 
        for(String s : set){
             System.out.println(s);
             if(!Jsoup.parse(html).select(s+":contains(Berkeley)").isEmpty()){ // check  if the tag contains your key word
             System.out.println(Jsoup.parse(html).select(s+":contains(Berkeley)").get(0).toString());} // print it out or do something else
            System.out.println("---------------------");
            System.out.println();            
        }       
     }   
  }

【讨论】:

  • 赞成 Java/JSoup 中的响应。我尝试了您的解决方案,并且正在尝试即兴发挥。会让你知道的。
猜你喜欢
  • 2010-10-11
  • 2022-09-29
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多