如何解决Android从HTML div类获取ID
我在下面给出了HTML代码
<div class='post-body entry-content float-container' id='post-body-962079523953434185'>
<p> <b>Probable11</b></p><p><b> </b>Player1,player2,player3,player4.<br /></p><p><b>C/VC</b></p><p><b> </b>PLayer1</p><p><span> Player2</span><br /></p><p><span> Player3</span></p><p><span> 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> <b>Probable11</b></p><p><b> </b>Player1,player2,player3,player4.<br /></p><p><b>C/VC</b></p><p><b> </b>PLayer1</p><p><span> Player2</span><br /></p><p><span> Player3</span></p><p><span> 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-body
和entry-content
选择元素。然后遍历它们以查找诸如文本Probable11
之类的独特内容,因为我希望这些类中可能包含许多元素。要获取id
,请使用方法id()
或attr("id")
。
Document doc = Jsoup
.parse("<div class='post-body entry-content float-container' id='post-body-962079523953434185'>"
+ "<p> <b>Probable11</b></p><p><b> </b>Player1,player4.<br />"
+ "</p><p><b>C/VC</b></p><p><b> </b>PLayer1</p><p><span> Player2</span><br />"
+ "</p><p><span> Player3</span></p><p><span> 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 举报,一经查实,本站将立刻删除。