0

我正在使用 COBRA HTMLParser,但没有运气解析一个特定的标签。这是来源:

<li id="eta" class="hentry">
  <span class="body">
    <span class="actions">
    </span>
    <span class="content">
    </span>
    <span class="meta entry">Content here
    </span>
    <span class="meta entry stub">Content here
    <span class="shared-content">
      Information by
      <a class="title" data="associate" href="/associate">Associate</a>
    </span>
    </span>
  </span>
</li>

我可以使用以下 XPath 来获取正确的信息:

            XPath xpath = XPathFactory.newInstance().newXPath();
            NodeList nodeList = (NodeList) xpath.evaluate("//span[contains(@class, 'body')]", document, XPathConstants.NODESET);
            int length = nodeList.getLength();
            System.out.println(nodeList.getLength());
            for(int i = 0; i < length; i++) {
                Element element = (Element) nodeList.item(i);
                NodeList n = null;
                try {
                    n = (NodeList) xpath.evaluate("span[contains(@class, 'content')]", element, XPathConstants.NODESET);
                    String body = n.item(0).getTextContent();
                    System.out.println("Content: " + body);
                } catch (Exception e) {};

                try {

                    String date = (String) xpath.evaluate("span[contains(@class, 'meta entry')]/a/span/@data", element, XPathConstants.STRING);
                    System.out.println("DATA: " + date);

                    String source = (String) xpath.evaluate("//span[contains(@class, 'meta entry')]/span", element, XPathConstants.STRING);
                    System.out.println("DATA: " + source);

                } catch (Exception e) {};

                //This does not work at all! I've tried every combination and still can't get it to run
                try {
                    String info = (String) xpath.evaluate("//span[@class='shared-content']/a/@data", element, XPathConstants.STRING);
                    System.out.println("INFO: " + info);
                } catch (Exception e) {};

            }

无论我尝试什么组合,最后一个表达式都不起作用。我也尝试过以下方法,但没有帮助,

        String info = (String) xpath.evaluate("//span[contains(@class, 'shared-content')]/a/@data", element, XPathConstants.STRING);
        String info = (String) xpath.evaluate("//span[contains(@class, 'meta entry info')]/span/a/@data", element, XPathConstants.STRING);

有什么建议么?

编辑:有一些关于 XML 非法的建议(老实说,我不确定为什么它是非法的,因为到目前为止我几乎到处都看到过)但我无法控制 XML (至少到星期一,直到我的其他朋友回来)。我正在尝试查看编写包含此信息的混搭的可行性。有什么办法可以禁用检查吗?

这是已解析的 XML:

       <?xml version="1.0" encoding="UTF-8"?>
          <span class="body">
            <span class="content">TextContent</span>
            <span class="meta entry">TextContent</span>

          </span>

我猜文档没有被正确解析。

4

4 回答 4

2

XPathVisualizer是一个不错的 XPath Visualizer 工具,在 Windows 上运行,可以让您查看 XPath 查询的结果。Xcopy 安装,单个 EXE 文件。自由的。

我拿走了它并在其中运行了您的查询,得到了以下结果:

替代文字

于 2009-11-26T23:03:15.477 回答
1

@Jherico,@Andrew Keith 我不知道 COBRA HTMLParser,但是将 #PCDATA 与内部节点结合是一种合法的 XML 格式。
这可以在 DTD 中这样定义:

<!ELEMENT text_node     (#PCDATA|i|b|u)*>

这就是格式良好的 HTML 仍然是合法 XML 的方式。

于 2009-11-26T22:37:37.560 回答
0

我运行了以下代码

public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException {
    Document doc = XmlUtil.parseXmlResource("/temp.xml");
    for (Node n : XPathUtil.getNodes(doc, "//span[contains(@class, 'body')]")) {
        System.out.println(XPathUtil.getStringValue(doc, "//span[@class='shared-content']/a/@data"));
    }
}

它输出“关联”。我认为你的 XPath 很好。发生了什么?您能否删除空的 catch 块,以便我们查看您是否真的遇到了异常?

注意,XmlUtil 和 XPathUtil 是我个人的便利函数,用于消除大部分 XPath 和 XML 样板代码。

于 2009-11-26T22:53:12.650 回答
0

我只是按原样运行您的代码示例(复制粘贴)并得到此输出。所以一切似乎都很好。(您使用的是哪个眼镜蛇版本?我 0.98.4)

1
Content:

DATA:
DATA:
      Information by
      Associate

INFO: associate

可重复的测试(?)

  • 使用javac/java 1.6.0_16版本(HotSpot Client:build 14.2-b01,混合模式,共享)
  • cobra-0.98.4.zip我从这里Sourceforge下载了 0.98.4 ( ) :Cobra HTML Toolkit 下载
  • 提取js.jarcobra.jarcobra-0.98.4.zip:\lib到一个目录XXX
  • 写在同一目录中(XMLTest.java文件名是指向源的链接)HTMLTest.java
  • 运行此编译(Windows):javac -cp .;cobra.jar;js.jar *.java
  • 然后像这样执行(包括输出)

XMLTest

java -cp .;cobra.jar;js.jar XMLTest 1

XMLTest 输出:

1
Content:

DATA:
DATA:
      Information by
      Associate

INFO: associate 

HTMLTest

java -cp .;cobra.jar;js.jar HTMLTest 1

HTMLTest 输出:

1
Content:

DATA:
DATA:
      Information by
      Associate

INFO: associate
于 2009-11-27T01:24:25.287 回答