Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用xpath提取结构化数据的策略_Javascript_Xpath - Fatal编程技术网

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

Javascript 使用xpath提取结构化数据的策略,javascript,xpath,Javascript,Xpath,是否存在使用XPath从HTML页面提取结构化数据的模式?我试图从页面上的一个或多个HTML表中提取数据。XPath使查找表变得很容易,但一旦找到了表,我就很难了 我目前正在做以下工作: 迭代表(可能有多个) 迭代该表中的行 迭代该行中的单元格 (然后可能将它们放入数组并解析内容) 我的代码是这样的: var tables = mydoc.evaluate( "//table", mydoc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, nul

是否存在使用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']
//table/tbody/tr/td[@class='label'] 
//table/tbody/tr/td/a[@class='value']
(我知道我正在使用XPath进行HTML解析,这并不是我真正想要的,但到目前为止它似乎还可以工作。)

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

//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']
使用

    //table/tbody/tr/td[@class='label']
|
    //table/tbody/tr/td/a[@class='value']
这个XPath表达式选择所有需要的节点(我知道的所有XPath引擎都会按文档顺序返回所选节点)。
|
(并集)运算符生成其参数的集合并集


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

,如果它位于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);

对于(var tables=document.getElementsByTagName(“table”),i=0;在XPath 1.0中,只有节点集数据类型不是原子类型。它是一个集合:无序的uniques节点,而不是“结构化”数据类型。您需要的是某种分组:对于每个
//table/tbody/tr
,然后提取
td[@class='label']
td/a[@class='value']
。问得好,+1。有关选择所需节点的单个XPath表达式,请参阅我的答案。