微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android从HTML div类获取ID

如何解决Android从HTML div类获取ID

我在下面给出了HTML代码

<div class='post-body entry-content float-container' id='post-body-962079523953434185'>
<p>&nbsp;<b>Probable11</b></p><p><b>&nbsp; &nbsp; </b>Player1,player2,player3,player4.<br /></p><p><b>C/VC</b></p><p><b>&nbsp; &nbsp;&nbsp;</b>PLayer1</p><p><span>&nbsp; &nbsp; Player2</span><br /></p><p><span>&nbsp; &nbsp; Player3</span></p><p><span>&nbsp; &nbsp; Player4</span></p>
</div>

我想使用jsoup android获取ID

解决方法

这将返回div ID

val str ="<div class='post-body entry-content float-container' id='post-body-962079523953434185'>\n <p>&nbsp;<b>Probable11</b></p><p><b>&nbsp; &nbsp; </b>Player1,player2,player3,player4.<br /></p><p><b>C/VC</b></p><p><b>&nbsp; &nbsp;&nbsp;</b>PLayer1</p><p><span>&nbsp; &nbsp; Player2</span><br /></p><p><span>&nbsp; &nbsp; Player3</span></p><p><span>&nbsp; &nbsp; Player4</span></p>\n</div>"

HtmlParser.buildSpannedText(str,object : HtmlParser.TagHandler {
      override fun handleTag(opening: Boolean,tag: String?,output: Editable?,attributes: Attributes?): Boolean {
           if (opening && tag.equals("div")) {
                 val id = HtmlParser.getValue(attributes!!,"id")
                 val value = HtmlParser.getValue(attributes!!,"value")
           }
           return false
      }
})

自定义TagHandler类

class HtmlParser private constructor(private val handler: TagHandler) : TagHandler,ContentHandler {
    interface TagHandler {
        fun handleTag(
            opening: Boolean,attributes: Attributes?
        ): Boolean
    }

    private var wrapped: ContentHandler? = null
    private var text: Editable? = null
    private val tagStatus: ArrayDeque<Boolean> = ArrayDeque()
    override fun handleTag(opening: Boolean,tag: String,output: Editable,xmlReader: XMLReader) {
        if (wrapped == null) {
            // record result object
            text = output

            // record current content handler
            wrapped = xmlReader.contentHandler

            // replace content handler with our own that forwards to calls to original when needed
            xmlReader.setContentHandler(this)

            // handle endElement() callback for <inject/> tag
            tagStatus.addLast(java.lang.Boolean.FALSE)
        }
    }

    @Throws(SAXException::class)
    override fun startElement(
        uri: String?,localName: String?,qName: String?,attributes: Attributes?
    ) {
        val isHandled = handler.handleTag(true,localName,text,attributes)
        tagStatus.addLast(isHandled)
        if (!isHandled) wrapped?.startElement(uri,qName,attributes)
    }

    @Throws(SAXException::class)
    override fun endElement(uri: String?,qName: String?) {
        if (!tagStatus.removeLast()) wrapped?.endElement(uri,qName)
        handler.handleTag(false,null)
    }

    override fun setDocumentLocator(locator: Locator?) {
        wrapped?.setDocumentLocator(locator)
    }

    @Throws(SAXException::class)
    override fun startDocument() {
        wrapped?.startDocument()
    }

    @Throws(SAXException::class)
    override fun endDocument() {
        wrapped?.endDocument()
    }

    @Throws(SAXException::class)
    override fun startPrefixMapping(prefix: String?,uri: String?) {
        wrapped?.startPrefixMapping(prefix,uri)
    }

    @Throws(SAXException::class)
    override fun endPrefixMapping(prefix: String?) {
        wrapped?.endPrefixMapping(prefix)
    }

    @Throws(SAXException::class)
    override fun characters(ch: CharArray?,start: Int,length: Int) {
        wrapped?.characters(ch,start,length)
    }

    @Throws(SAXException::class)
    override fun ignorableWhitespace(ch: CharArray?,length: Int) {
        wrapped?.ignorableWhitespace(ch,length)
    }

    @Throws(SAXException::class)
    override fun processingInstruction(target: String?,data: String?) {
        wrapped?.processingInstruction(target,data)
    }

    @Throws(SAXException::class)
    override fun skippedEntity(name: String?) {
        wrapped?.skippedEntity(name)
    }

    companion object {
        fun buildSpannedText(html: String,handler: TagHandler): Spanned {
            // add a tag at the start that is not handled by default,// allowing custom tag handler to replace xmlReader contentHandler
            return Html.fromHtml("<inject/>$html",null,HtmlParser(handler))
        }

        fun getValue(attributes: Attributes,name: String): String? {
            var i = 0
            val n: Int = attributes.getLength()
            while (i < n) {
                if (name == attributes.getLocalName(i)) return attributes.getValue(i)
                i++
            }
            return null
        }
    }
}
,

通过类post-bodyentry-content选择元素。然后遍历它们以查找诸如文本Probable11之类的独特内容,因为我希望这些类中可能包含许多元素。要获取id,请使用方法id()attr("id")

Document doc = Jsoup
        .parse("<div class='post-body entry-content float-container' id='post-body-962079523953434185'>"
                + "<p>&nbsp;<b>Probable11</b></p><p><b>&nbsp; &nbsp; </b>Player1,player4.<br />"
                + "</p><p><b>C/VC</b></p><p><b>&nbsp; &nbsp;&nbsp;</b>PLayer1</p><p><span>&nbsp; &nbsp; Player2</span><br />"
                + "</p><p><span>&nbsp; &nbsp; Player3</span></p><p><span>&nbsp; &nbsp; Player4</span></p></div>");

Elements posts = doc.select(".post-body.entry-content");
for (Element post : posts) {
    if (post.text().contains("Probable11")) {
        System.out.println(post.id());
        // alternative:
        System.out.println(post.attr("id"));
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。