这是一个关于食物的开放式数据库的页面:
http://www.dabas.com/ProductSheet/Details.ashx/121308
我试图使用XPath从这个页面获取一些信息。 我感兴趣的表是:Näringsvärde。 我希望将“Näringsvärde”中的所有文本节点保存为字符串。
这是上面链接的代码的相关部分:
<!DOCTYPE html>
<html>
...
<body>
...
<table class="width100" style="page-break-inside: avoid">
<caption>
Produktinformation
<img src="../../images/ProductSheet/draw-triangle3.png" id="toggleProduktinformation"
class="imgCaptionOn" />
</caption>
<tbody id="tbodyProduktinformation">
<tr>
<td class="col1">
Ursprungsland:
</td>
<td>
Sverige </td>
</tr>
...
</tbody>
</table>
<table id="tableHover" class="width100 marginTop30 bgTable">
<tr class="nohover">
<td class="tdLeft48 padding0">
<table id="nutritiveTabel" class="leftTable" style="page-break-inside: avoid">
<caption>
Näringsvärde
<img src="../../images/ProductSheet/draw-triangle3.png" id="toggleNutritiveValues"
class="imgCaptionOn" />
</caption>
<tbody id="tbodyNutritiveValues">
<tr id="divNutritiveValues">
<td class="padding">
<table class="noBorder width100">
<tr>
<td class="col1">
Tillagningsstatus:
</td>
<td>Tillagad</td>
<td colspan="2">
&amp;nbsp;
</td>
</tr>
...
</table>
</td>
</tr>
</tbody>
</table>
</td>
...
</html>
到目前为止,我尝试使用类似的东西,但它没有用:
public List<string> GetNaring(string xid) {
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(xid);
var xpath = "/html/body/div/div[2]/div[2]/table[2]/tbody/tr/td/table/tbody";
var links = doc.DocumentNode.SelectNodes(xpath);
return links.Select(n => n.InnerText).ToList();
}
但这只会回复 null ,我错过了什么?
答案 0 :(得分:1)
XPath表达式:
/html/body/div/div[2]/div[2]/table[2]/tbody/tr/td/table/tbody
与任何节点都不匹配。
由于你有一个可以匹配的唯一字符串,你应该使用它。在源代码中搜索该字符串,您将找到:
...
<td class="tdLeft48 padding0">
<table id="nutritiveTabel" class="leftTable" style="page-break-inside: avoid">
<caption>
Näringsvärde
<img src="../../images/ProductSheet/draw-triangle3.png" id="toggleNutritiveValues"
class="imgCaptionOn" />
</caption>
<tbody id="tbodyNutritiveValues">
<tr id="divNutritiveValues">
...
该字符串是您想要的表中caption
元素的子元素。您必须获取该元素的字符串值,修剪额外的空格并使用结果与“Näringsvärde”进行比较。您可以使用以下表达式选择正确的table
:
//table[normalize-space(caption/text())='Näringsvärde']
获得正确的表后,您可以在其中导航并选择所需的节点,或者您可以获取 string-value ,它是所有后代文本节点的串联:
//table[normalize-space(caption/text())='Näringsvärde']//td
这将返回文本所在的所有td
个节点。