Android从HTML div类获取ID

时间:2020-09-04 05:10:56

标签: android html jsoup

我在下面给出了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

2 个答案:

答案 0 :(得分:0)

这将返回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,
            tag: String?,
            output: Editable?,
            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, localName, qName, attributes)
    }

    @Throws(SAXException::class)
    override fun endElement(uri: String?, localName: String?, qName: String?) {
        if (!tagStatus.removeLast()) wrapped?.endElement(uri, localName, qName)
        handler.handleTag(false, localName, text, 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?, start: Int, length: Int) {
        wrapped?.ignorableWhitespace(ch, start, 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
        }
    }
}

答案 1 :(得分:0)

通过类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, 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>");

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"));
    }
}
相关问题