假设我有以下代码要使用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元素。我觉得这很慢。

最佳答案

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

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();
        }
     }
  }

09-10 03:12
查看更多