XPath 查询不适用于此 table
XPath query not working for this table
我有很多 table 这种格式:
<table class="DataRows" frame="myFrames" rules="Standard" width="100%">
<colgroup><col width="70" align="CENTER">
<col width="200" align="LEFT">
<col width="80" align="LEFT">
<col align="LEFT">
<col align="RIGHT">
</colgroup><thead>
<col width="70" align="CENTER">
<col width="200" align="LEFT">
<col width="80" align="LEFT">
<col align="LEFT">
<col align="RIGHT">
<thead>
<tr>
<td valign="TOP"><span class="classicBold"> 20 </span> Kg.
<td class="BOLD" valign="TOP" nowrap="">
PA Passion Foods Inc.
<td class="BOLD">Fax:
<td>
222-555666
<td class="BOLD">
Processed foods and juices
<tr>
<td><a target="_blank" href="">See on Map </a>
<td>
120 NW 157TH AVE
<td class="BOLD">Warehouse Hours:
<td colspan="2">
<tr>
<td>
<td><span class="BOLD">
Jacksonville,
</span>
FL 300000
<td class="BOLD">Url:
<td colspan="2">
<a target="_blank" href="">PA Passion</a>
  
<span class="BOLD">E-mail:</span>
zoro@xyz.com
<tr>
<td>
<td class="REDBOLD" colspan="4">
<tr>
<td>
<td colspan="4" align="LEFT">Franchisee for:<span class="BOLD">
Nutrella
</span>
<tr>
<td>
<td colspan="4" align="LEFT">Franchisee for:<span class="BOLD">
APPLE Foods, Constants
</span>
<tr>
<td>
<td colspan="4" align="LEFT"><span class="BOLD">
</span>
<tr>
<td>
<td colspan="4" align="LEFT">We service:<span class="BOLD">
All occasions and hospitality services
</span>
<tr>
<td>
<td colspan="4" align="LEFT">We sell :<span class="BOLD">
----
</span>
</td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></td></td></tr></td></td></td></td></tr></td></td></td></td></td></tr>
</thead>
</table>
我正在使用 HtmlAgilityPack 使用此代码循环遍历每个 tables
foreach (HtmlNode node in htmlAgilityPackDoc.DocumentNode.SelectNodes("//table[contains(@class,'DataRows')]"))
{
}
这为我提供了每次迭代的整个节点,其中一个是上面的 table。我尝试使用下面的代码在每次迭代中访问公司名称。
string str= node.ChildNodes.Descendants() .SelectSingleNode("//td[@class='BOLD']").InnerText
但我得到的只是循环中提取的每个 table 的第一个 table 的公司名称。当我遍历循环中的每个 table 时,如何获取下一个公司名称和地址?
node.SelectSingleNode(By.Xpath(.//td[@class='BOLD'])).Innertext
这可能有效。
正如评论中所说,使用 HAP 应该将 XPath 用作前 xpath 中的 "extension",以“.”开头 - 当前节点,如果我没记错的话
这是尝试从 //
轴开始的相对 XPath 时的常见错误。尽管您从 node
变量调用 SelectSingleNode()
,XPath 仍然被认为是全局的,这意味着它是相对于 XML 的根元素的。这就是为什么你每次总是得到相同的元素,它是整个 XML.
中第一个匹配的元素
要使 XPath 范围在当前 node
元素内局部化,只需在 XPath 的开头放置一个点 (.
) :
string str = node.SelectSingleNode(".//td[@class='BOLD']")
.InnerText;
我有很多 table 这种格式:
<table class="DataRows" frame="myFrames" rules="Standard" width="100%">
<colgroup><col width="70" align="CENTER">
<col width="200" align="LEFT">
<col width="80" align="LEFT">
<col align="LEFT">
<col align="RIGHT">
</colgroup><thead>
<col width="70" align="CENTER">
<col width="200" align="LEFT">
<col width="80" align="LEFT">
<col align="LEFT">
<col align="RIGHT">
<thead>
<tr>
<td valign="TOP"><span class="classicBold"> 20 </span> Kg.
<td class="BOLD" valign="TOP" nowrap="">
PA Passion Foods Inc.
<td class="BOLD">Fax:
<td>
222-555666
<td class="BOLD">
Processed foods and juices
<tr>
<td><a target="_blank" href="">See on Map </a>
<td>
120 NW 157TH AVE
<td class="BOLD">Warehouse Hours:
<td colspan="2">
<tr>
<td>
<td><span class="BOLD">
Jacksonville,
</span>
FL 300000
<td class="BOLD">Url:
<td colspan="2">
<a target="_blank" href="">PA Passion</a>
  
<span class="BOLD">E-mail:</span>
zoro@xyz.com
<tr>
<td>
<td class="REDBOLD" colspan="4">
<tr>
<td>
<td colspan="4" align="LEFT">Franchisee for:<span class="BOLD">
Nutrella
</span>
<tr>
<td>
<td colspan="4" align="LEFT">Franchisee for:<span class="BOLD">
APPLE Foods, Constants
</span>
<tr>
<td>
<td colspan="4" align="LEFT"><span class="BOLD">
</span>
<tr>
<td>
<td colspan="4" align="LEFT">We service:<span class="BOLD">
All occasions and hospitality services
</span>
<tr>
<td>
<td colspan="4" align="LEFT">We sell :<span class="BOLD">
----
</span>
</td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></td></td></tr></td></td></td></td></tr></td></td></td></td></td></tr>
</thead>
</table>
我正在使用 HtmlAgilityPack 使用此代码循环遍历每个 tables
foreach (HtmlNode node in htmlAgilityPackDoc.DocumentNode.SelectNodes("//table[contains(@class,'DataRows')]"))
{
}
这为我提供了每次迭代的整个节点,其中一个是上面的 table。我尝试使用下面的代码在每次迭代中访问公司名称。
string str= node.ChildNodes.Descendants() .SelectSingleNode("//td[@class='BOLD']").InnerText
但我得到的只是循环中提取的每个 table 的第一个 table 的公司名称。当我遍历循环中的每个 table 时,如何获取下一个公司名称和地址?
node.SelectSingleNode(By.Xpath(.//td[@class='BOLD'])).Innertext
这可能有效。 正如评论中所说,使用 HAP 应该将 XPath 用作前 xpath 中的 "extension",以“.”开头 - 当前节点,如果我没记错的话
这是尝试从 //
轴开始的相对 XPath 时的常见错误。尽管您从 node
变量调用 SelectSingleNode()
,XPath 仍然被认为是全局的,这意味着它是相对于 XML 的根元素的。这就是为什么你每次总是得到相同的元素,它是整个 XML.
要使 XPath 范围在当前 node
元素内局部化,只需在 XPath 的开头放置一个点 (.
) :
string str = node.SelectSingleNode(".//td[@class='BOLD']")
.InnerText;