如何使用Jsoup Library从HTML文档中获取所有元素?

时间:2015-09-28 10:38:28

标签: android html jsoup

我尝试使用Jsoup library解析HTML标记。我想遍历所有元素。并将"\br"替换为""。我使用以下方法:

 private void parseHtmlDoc(Document doc){
        StringBuilder builder;
        List<String> descriptionList=new ArrayList<String>();
         builder=new StringBuilder();
        Elements elementList=doc.getAllElements();
        for(Element element:elementList){
            if(element.equals(doc.select("\r\n"))){
                builder.append(element.text());
                builder.append("\n");
                Log.d("HTML",builder.toString());
            }

            else if(element.equals(doc.select("<img>"))){
                if(builder.length()!=0) {
                    String text = builder.toString();
                    descriptionList.add(text);
                    Log.d("HTML", text);
                }

                 builder=new StringBuilder();

            }

        }

但我的应用程序正在崩溃:

   for(Element element:elementList)

我在这里做错了什么......请帮我解决这个问题。

更新代码:

我将实现更改为以下代码:

 Elements elements=doc.getElementsByTag("html");
        for(Element element:elements){
            Log.d("HTML",element.text());
        }

现在,我正在获取元素中的所有标记。此元素包含内部标记,例如


&lt; \ n&gt; 。我想迭代每个标签并替换它们。我在这一点上陷入困​​境。我不知道如何从Html标签中获取子元素。

1 个答案:

答案 0 :(得分:0)

我不确定我完全理解你要做什么,但也许这会给你一个大方向:

    Document doc;
    try {
        doc = Jsoup.connect("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br").get();
        String htmlNoBr  = doc.html().replaceAll("<br>", "");
        System.out.println(htmlNoBr);
    } catch (IOException e) {
        e.printStackTrace();
    }

上面的代码取代了所有&#34;&lt; BR&GT;&#34;在带有空字符串的html中出现,并将结果返回给htmlNoBr String对象。

如果你想要删除所有&#34;&lt; BR&GT;&#34;创建一个换行符,我假设你这样做。你应该忽略所有&#34;&lt; BR&GT;&#34;适用于白色的标签&#34;&lt;预&GT;&#34;像这样的标签:

private static final String PRE_TAG = "pre";

public static void  parseHtmlDoc(Document doc) {
    Elements elementList = doc.getAllElements();
    for (Element element : elementList) {

        //if the tag isn't <pre> add it to new elements collection
        if(element.tag().toString().compareTo(PRE_TAG) != 0)
        {
            element.text(element.text().replaceAll("<br>", ""));

        }

    }

}

希望这会有所帮助。 此外,下次代码崩溃时,请将崩溃日志添加到您的问题中。

[更新] 要在评论中回答您的问题,这是您可以迭代所有元素及其子元素的一种方式:

    public static void recurseOverElements(Elements elementList){

    if(elementList.size() == 0)
        return;

    for (Element element : elementList) {

        recurseOverElements(element.children());
        System.out.println("element tag = " + element.tagName());
    }


}

[更新2] 使用此代码调用函数:

public static void main(String[] args) {

    Document doc;
    try {
        doc = Jsoup.connect("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br").get();
        //Create a new empty elements collection
        Elements allElementsInDom = new Elements();
        //send to a method that recurses over all child elements and adds them to the new collection
        recurseOverElements(doc.getAllElements(), allElementsInDom);

        //Iterate over all the elements and their child elements from the DOM
        for (Element element : allElementsInDom) {
            System.out.println(element.tagName());
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

}

这些是对上述方法所做的更改:

/*
 * Iterates over all elements and child elements in elementList
 * Returns allChildElemets collections with all nested elements 
 */
public static Elements recurseOverElements(Elements elementList, Elements allChildElemets){
    if(elementList.size() == 0)
        return allChildElemets;

    for (Element element : elementList) {

        recurseOverElements(element.children(), allChildElemets);
        allChildElemets.add(element);
    }
    return allChildElemets;
}

我不知道是否有更好的方法,但我就是这样做的。