【问题标题】:XPath How to retrieve the value of a table cell from html documentXPath 如何从 html 文档中检索表格单元格的值
【发布时间】:2011-08-21 08:11:43
【问题描述】:

我有一个 html 文档,文档内的某处位于表格下方,我可以获取表格行和 java DOM 对象。我不清楚的是,当值是字符串以及二进制资源时,如何提取表格单元格的值?

我正在使用如下代码:

  XPath xpath;
   XPathExpression expr;
   NodeList nodes=null;
   // Use XPath to obtain whatever you want from the (X)HTML
   try{

      xpath = XPathFactory.newInstance().newXPath();
      //<table class="data">

      NodeList list = doc.getElementsByTagName("table");
     // Node node = list.item(0); 
     //System.out.println(node.getTextContent());
    //String textContent=node.getTextContent();

    expr = xpath.compile("//table/tr/td");
    nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);

和循环喜欢:

     for (int i = 0; i < nodes.getLength(); i++) {

       Node ln = list.item(i);
       String lnText=ln.toString();
       NodeList rowElements=ln.getChildNodes();
       Node one=rowElements.item(0);

       String oneText=one.toString();
       String nodeName=one.getNodeName();
       String valOne = one.getNodeValue();

但我没有看到表中的值。

 <table class="data">
 <tr><td>ImageName1</td><td width="50"></td><td><img src="/images/036000291452" alt="036000291452" /></td></tr>
 <tr><td>ImageName2</td><td width="50"></td><td><img src="/images/36000291452" alt="36000291452" /></td></tr>
 <tr><td>Description</td><td></td><td>Time Magazine</td></tr>
 <tr><td>Size/Weight</td><td></td><td>14 Issues</td></tr>
 <tr><td>Issuing Country</td><td></td><td>United States</td></tr>
  </table>

【问题讨论】:

  • 好问题,+1。请参阅我的答案,以获得针对此问题的完整简短的单行 XPath 解决方案。

标签: java html xpath jtidy


【解决方案1】:

这个 XPath 表达式

/*/tr[1]/td[1]

选择作为所提供 XML 文档的顶部元素 (table) 的第一个 tr 子元素 (table) 的第一个子元素的 td 元素(在无命名空间中)。

XPath 表达式

/*/tr[1]/td[2]

选择作为所提供 XML 文档的顶部元素 (table) 的第一个 tr 子元素 (table) 的第二个子元素的 td 元素(在无命名空间中)。

一般情况

/*/tr[$m]/td[$n]

选择td 元素(在无命名空间中),它是提供的 XML 文档的顶部元素 (table) 的 $m-th tr 子元素的 $n-th 子元素。只需将 $m$n 替换为所需的整数值即可。

您可以使用标准的 XPath 函数 string() 来获取它们的字符串值:

string(/*/tr[$m]/td[$n])

计算为 $n-th 子元素 $m-th tr 的顶部元素 (table) 的 td 元素(在无命名空间中)的字符串值提供的 XML 文档。

【讨论】:

  • 现在就执行这个表达式而言,我正在使用 Java API。所以我执行如下:
  • XPathExpression exp = xpath.compile("string(/*/tr[3]/td[1])"); String val =(String) exp.evaluate(doc, XPathConstants.STRING);
  • 但是我没有得到一个字符串值。你能评论一下这个表达式的执行吗?
  • XPathExpression exp = xpath.compile("string(//*/tr[3]/td[1])");节点 val =(Node) exp.evaluate(doc, XPathConstants.NODE);返回一个值,但请注意额外的 / 并且它不是字符串值。
  • @Androider:我不是Java程序员,你需要阅读、练习示例并理解这些API。此外,如果文档位于默认命名空间中,您获得的(缺少)结果是完全可以解释的。您从未展示过完整的 XML 文档。我预计文档可能位于默认命名空间中,这就是为什么我总是说“选择td 元素(在无命名空间中)”,因为如果有默认命名空间,这些表达式都不会选择任何东西。请出示(编辑您的问题)完整(尽可能小)的 XML 文档。
【解决方案2】:

使用类似“string(//td)”的路径来获取每个单元格的字符串内容。对于链接资源,您需要使用“//td/img/@src”之类的内容来获取 URL,然后相对于源 url 规范化它们,并从网络中获取结果 URL。

【讨论】:

  • 好的。究竟如何将此 xpath 应用于表。假设我描述:时代杂志。
  • 我的意思是我的路径给了我一行 td。但是当我检索 tds 时,td 的值不是可以打印的文本值。 getTextValue getContentValue 不返回值。你如何使用 string("//td") 索引单元格谢谢
  • string("//td") 并没有真正帮助通过索引将它们取出。我提供了确切的表格。我需要找到一种可索引的方式来做到这一点。
  • XPath 如何从 html 文档中检索表格单元格的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多