【问题标题】:Bad XPath or bad JSoup?糟糕的 XPath 还是糟糕的 JSoup?
【发布时间】:2014-09-07 12:19:07
【问题描述】:

请注意:虽然这个问题直接涉及一个名为 JSoup 的 Java HTML 解析库,但我真的相信这是一个 XPath 问题(并且通过解决方案)。

我们有一个提供 HTML 页面的内部网络应用程序,fizz.html。在这个页面上,有一个重要的 ID 号,另一个进程需要能够在它运行的任何时候获取它。此 ID 会定期/可预测地更改;因此,有一天,HTML 页面中的 ID 可能是“394959”。改天可能是“248483”等。由于此问题上下文之外的原因,此 HTML 页面是获取 ID 的唯一方法

所以我想使用 JSoup 来访问 HTML 页面的 URL,并使用 Xpath 选择器解析 ID。

HTML 页面(jsFiddle):

http://jsfiddle.net/B5zvV/

这里有问题的 ID 可以在 jsFiddle 的第 238 行找到:

<a href="/chain/admin/config/editRepository.action?planKey=AB-CSD&amp;repositoryId=28049450">

它是repositoryId,在这种情况下它当前是“28049450”。

我的 JSoup 代码:

Document doc = Jsoup.connect("http://myapp.example.com/fizz.html").get()    // See the jsFiddle above
Elements repoIdElems = doc.select("//*[@id=\"panel-editor-list\"]/ul")

当我运行它时,我得到:

Exception in thread "main" org.jsoup.select.Selector$SelectorParseException: Could not parse query '//*[@id="panel-editor-list"]/ul': unexpected token at '//*[@id="panel-editor-list"]/ul'
    at org.jsoup.select.QueryParser.findElements(QueryParser.java:196)
    at org.jsoup.select.QueryParser.parse(QueryParser.java:53)
    at org.jsoup.select.QueryParser.parse(QueryParser.java:39)
    at org.jsoup.select.Selector.<init>(Selector.java:80)
    at org.jsoup.select.Selector.select(Selector.java:93)
    at org.jsoup.nodes.Element.select(Element.java:252)
    at org.jsoup.nodes.Element$select.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at com.me.myorg.parser.ClientParser.executeIntegration(ClientParser.groovy:98)
    at com.me.myorg.parser.ClientParser$executeIntegration.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
    at com.me.myorg.parser.ClientParser.main(ClientParser.groovy:143)

所以我问:这是一个糟糕的 XPath(很可能),还是我使用 JSoup API 的方式有问题?

【问题讨论】:

    标签: java xpath syntax html-parsing jsoup


    【解决方案1】:

    Jousp 不支持 xpath。 select 语句只接受 CSS 选择器。

    【讨论】: