使用xpath提取结构化数据的策略

时间:2011-03-26 22:42:41

标签: javascript xpath

是否有使用XPath从HTML页面提取结构化数据的模式?我正在尝试从页面上的一个或多个HTML表中提取数据。 XPath可以很容易地找到表格,但是一旦我到达目的地,我就会挣扎。

我目前正在做以下事情:

  • 迭代表格(可能有不止一个)
  • 迭代该表中的行
  • 迭代该行中的单元格
  • (然后可能将它们放在一个数组中并解析内容)

我的代码是这样的:

var tables = mydoc.evaluate( "//table", mydoc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );

table = tables.iterateNext();
while (table)
{
  var rows = mydoc.evaluate("tbody/tr", table, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
  row = rows.iterateNext();
  while (row)
  {
    var tds = mydoc.evaluate("td", row, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
    td = tds.iterateNext()
    while(td)
    {
      // TODO: store content in an array to process later
      print('*' + td.textContent);
      td = tds.iterateNext();
    }
    row = rows.iterateNext();
  }

  table = iterator.iterateNext();
}

这看起来有点令人讨厌,因为所有XPath示例似乎只需要一步完成它们的处理。似乎很少有非平凡的例子,其中选择和组合两种类型的数据(例如表格中的标签和值)。我可以使用以下选择器,但最终得到两个没有结构的列表:

//table/tbody/tr/td[@class='label']
//table/tbody/tr/td/a[@class='value']

(我知道我正在使用XPath进行HTML解析,但实际上并不是这样,但到目前为止它似乎有用。)

2 个答案:

答案 0 :(得分:2)

  

似乎很少有不平凡的事情   两种类型数据的例子(例如   表格中的标签和值)   选择和组合。我可以使用   以下选择器,但我最终   两个没有结构的列表:

//table/tbody/tr/td[@class='label'] 
//table/tbody/tr/td/a[@class='value']

使用

    //table/tbody/tr/td[@class='label']
|
    //table/tbody/tr/td/a[@class='value']

此单个XPath表达式选择所有需要的节点(我知道的所有XPath引擎都按文档顺序返回所选节点)。 |(union)运算符生成其参数的集合并。

如果(x)Html文档具有常规结构,您可能希望在返回的结果中每个选定的td元素(标签)后跟其对应的a元素(值)

答案 1 :(得分:0)

如果它在主HTML页面上,您可以这样做:

for(var tables=document.getElementsByTagName("table"),i=0;i<tables.length;++i)
  for(var rows=tables[i].getElementsByTagName("tr"),j=0;j<rows.length;++j)
    for(var cells=rows[j].getElementsByTagName("td"),k=0;k<cells.length;++k)
      print("*"+cells[i].textContent);

getElementsByTagName执行/不执行/返回数组 - 它返回类似于ORDERED_NODE_ITERATOR_TYPE的实时NodeList。