是否有使用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解析,但实际上并不是这样,但到目前为止它似乎有用。)
答案 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。