获取jsoup中html字符串中的所有属性

时间:2014-11-06 12:34:14

标签: java jsoup

我有HTML格式的字符串,我试图使用Jsoup获取所有属性及其值。

字符串是

String string= 
"<button class=submit btn primary-btn flex-table-btn js-submit type=submit>Sign in</button>";

 Document doc = Jsoup.parse(string);
    try {
        org.jsoup.nodes.Attributes attrs = doc.attributes();

        for( org.jsoup.nodes.Element element : doc.getAllElements() )
        {
              for( Attribute attribute : element.attributes() )
              {
                  System.out.println( attribute.getKey() +  " --::-- "+attribute.getValue()  ); 
              }
        }

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

我想要的输出是::

key: **class** , Value is: **submit btn primary-btn flex-table-btn js-submit**

key: **type** , Value is: **submit**

但我得到的是这个

key: class , Value is: submit key: btn , Value is: key: primary-btn , Value is: key: flex-table-btn , Value is: key: js-submit , Value is: key: type , Value is: submit

这是因为引号。如果我使用

String string= 
"<button class='submit btn primary-btn flex-table-btn js-submit' type='submit'>       Sign in</button>";

我会得到我想要的输出。但我试图得到没有引号。

2 个答案:

答案 0 :(得分:0)

无法在没有引号的情况下进行,因为引号不是可选的。如果没有引号,您引用的HTML会描述一个元素,其中包含一个类(submit)和一系列非类,无效的附加属性,其名称为{{1} },btn等,以及任何浏览器将如何解释它,就像JSoup正在做的那样。如果要在元素上添加其他类,则引号为必需

来自the specification

  

不带引号的属性值语法

     

属性名称,后跟零个或多个空格字符,后跟单个U + 003D EQUALS SIGN字符,后跟零个或多个空格字符,后跟属性值,除了上面给出的要求之外属性值, 不得包含任何文字空格字符 ,任何U + 0022引号标记字符(&#34;),U + 0027 APOSTROPHE字符(&#39;) ,&#34; =&#34; (U + 003D)字符,&#34;&lt;&#34; (U + 003C)个字符,&#34;&gt;&#34; (U + 003E)字符,或U + 0060 GRAVE ACCENT字符(`),不得为空字符串。

请注意,&#34;不得包含任何文字空格字符&#34; 我强调的部分。

答案 1 :(得分:0)

Jsoup很简单:

Document doc = Jsoup.parse(HTML);
List<String> tags = new ArrayList<String>(); //record tags

for(Element e : doc.getAllElements()){      // all elements in html

    tags.add(e.tagName().toLowerCase());    // add each tag in tags List
    //System.out.println("Tag: "+ e.tag()+" attributes = "+e.attributes());  // attributes with values in string
    //System.out.println("Tag: "+ e.tag()+" attributes = "+e.attributes().asList()); //attributes in List<Attribute>

    for(Attribute att : e.attributes().asList()){ // for each tag get all attributes in one List<Attribute>
        System.out.print("Key: "+att.getKey()+ " , Value: "+att.getValue());
        System.out.println();
    }
}

System.out.println("*****************");
System.out.println("All Tags = "+tags);
System.out.println("Distinct Tags = "+ new HashSet<String>(tags));