honghaoz / Ji

Ji (戟) is an XML/HTML parser for Swift
MIT License
824 stars 64 forks source link

有没有方法只解析本级别的content,不解析下级的content #23

Closed jiti1000 closed 8 years ago

jiti1000 commented 8 years ago

Hi, 晚上好, 在解析时,预想只解析本级别的content,有没有方便的实现办法, html字符串如下: jiissue 代码如下: let elements = JiDocument.xPath("//a")?.first?.content 调试输出如下: 3742c6f3-4280-4eeb-87c3-36a349d8d4b8

问题:本次解析时,我只想得到 "新闻" 这个content,不希望下级的2267也解析出来。

新手,请多指教, 感谢!🙏

honghaoz commented 8 years ago

@jiti1000 Hi,针对这个问题,有两种办法。 方法一(推荐): 修改xpath为//a/text()

let elements = JiDocument.xPath("//a/text()")?.first?.content

这样,只有a里面的文字会被拿出来,span里的东西就被忽略了。

方法二: 可以更改JiNode的keepTextNode属性为true

JiDocument?.rootNode?.keepTextNode = true
let elements = JiDocument.xPath("//a/text()")?.first!
print(eles?.children[1].content)

然后取到的a节点会有两个子节点,一个是span节点,另一个是text节点,也就是包含新闻字符的节点。

默认情况下,keepTextNodefalse

jiti1000 commented 8 years ago

再请教下,需要解析的 字符串中 "//a/text()" // 和 / 有什么区别?

honghaoz commented 8 years ago

@jiti1000 请参考这个 http://www.w3schools.com/xsl/xpath_syntax.asp

jiti1000 commented 8 years ago

Thanks! 还发现一个使用的问题,不知道是bug还是我使用的问题。 html字符如下: 1 程序如下: JiDocument.xPath("//li/a")?.count let elements = JiDocument.xPath("//li/a")!

let a = elements[0].rawContent let b = elements[1].rawContent let c = elements[2].rawContent

let d = elements[0].xPath("//a/text()").first?.content let e = elements[1].xPath("//a/text()").first?.content let f = elements[2].xPath("//a/text()").first?.content

调试输出入下图: 2

我预想的是 d="勋章申请区" , e="CHH第二届机王争霸赛", f="大恶魔的Blog" 但是实际d,e,f 都 = "勋章申请区"

我暂时解决办法是把每个element先取rawcontent,然后再转JiDocument, 再xpath一次,感觉这样比较繁琐,帮忙看下是否有方便的办法,感谢

honghaoz commented 8 years ago

@jiti1000 你试试吧d,e,f 里的xpath改成./text() 看看?还是上面那个连接,.是选取当前node的。

jiti1000 commented 8 years ago

太感谢啦!