解析HTML结构
问题描述:
下面是我的HTML结构(表):解析HTML结构
<table>
<tr><td>A</td></tr>
</table>
<table>
<tr><td>B</td></tr>
</table>
<table>
<table>
<table>
<table>
<tbody>
<tr class="A">
<td>
ABC
</td>
<td>
<a href="abc.com">Link</a>
</td>
</tr>
<tr class="B">
<td>
DEF
</td>
<td>
<a href="abcd.com">Link2</a>
</td>
</tr>
</tbody>
</table>
</table>
</table>
</table>
我试图让数据如下:
HtmlNode thediv = doc.DocumentNode.SelectSingleNode("//table[3]//table[1]");
⇒它运作良好。
但是,我试过代码如下表3
HtmlNode thediv = doc.DocumentNode.SelectSingleNode(
"//table[3]//table[1]//table[2]//table[3]");
⇒不正常获取数据ABC/DEF。
答
我想你真正想要的是
var bothNodes = doc.DocumentNode.SelectNodes("//table[3]//table[1]//tr/td[1]/text()");
这会给你两个节点ABC
和第三台的DEF
你可以在这里尝试一下:XPathFiddle
你的代码没有按” t工作,因为没有适合第二个查询的节点。 分步:
这是你原来的HTML:
<table>
<tr><td>A</td></tr>
</table>
<table>
<tr><td>B</td></tr>
</table>
<table>
<table>
<table>
<table>
<tbody>
<tr class="A">
<td>
ABC
</td>
<td>
<a href="abc.com">Link</a>
</td>
</tr>
<tr class="B">
<td>
DEF
</td>
<td>
<a href="abcd.com">Link2</a>
</td>
</tr>
</tbody>
</table>
</table>
</table>
</table>
//table[3]
给你第三个表
<table>
<table>
<table>
<table>
<tbody>
<tr class="A">
<td>
ABC
</td>
<td>
<a href="abc.com">Link</a>
</td>
</tr>
<tr class="B">
<td>
DEF
</td>
<td>
<a href="abcd.com">Link2</a>
</td>
</tr>
</tbody>
</table>
</table>
</table>
</table>
//table[3]//table[1]
给你的第一个表这是第三个表的后裔。
<table>
<table>
<table>
<tbody>
<tr class="A">
<td>
ABC
</td>
<td>
<a href="abc.com">Link</a>
</td>
</tr>
<tr class="B">
<td>
DEF
</td>
<td>
<a href="abcd.com">Link2</a>
</td>
</tr>
</tbody>
</table>
</table>
</table>
//table[3]//table[1]//table[2]
会给你第二个表,这是一个后代的第一个表这是第三个表的后裔。而且只有一个 - >不起作用。
答
嗨Manfred Radlwimmer,
感谢您的回答。我做的 :)。
的代码如下:
if (doc.DocumentNode.SelectNodes("//table") != null)
{
HtmlNode thediv = doc.DocumentNode.SelectSingleNode("//table[3]//table[1]//tr/td[1]//tr[3]//table//tr/td[2]//table");
HtmlNodeCollection cells = thediv.SelectNodes("tr");
for (var j = 1; j < cells.Count; ++j)
{
var data= cells[j].InnerText;
}
}
嗨曼弗雷德Radlwimmer, 感谢您的回答。我做的 :)。 – tranphu0ng