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