【发布时间】:2014-08-27 19:17:26
【问题描述】:
我正在使用 HtmlAgilityPack 抓取一些数据。
HTML 如下所示:
<div id="id-here">
<dl>
<dt> Field Name </dt>
<dd> Value for above field name </dd>
<dt> Field Name </dt>
<dd> Value for above field name </dd>
<dt> Field Name </dt>
<dd> Value for above field name </dd>
</dl>
</div>
现在我遇到的问题是,并不总是有一定数量的字段,所以我无法可靠地访问每个字段,例如:
//*[@id="id-here"]/dl[1]/dd[1]
因为 dd[1] 可能是一个页面上的名称和另一个页面上的电话,其中用户未能填写名称,因此字段被隐藏。
所以我像这样抓取所有 DT 和 DD 节点:
//*[@id="id-here"]/dl[1]/dt | //*[@id="id-here"]/dl[1]/dd
现在我检查每个节点,看看它是否与我想要的字段匹配,然后像这样获取 NextSibling 值:
foreach (HtmlNode node in details)
{
if (node.InnerText.Contains("Tel:")) telephone = node.NextSibling.InnerText;
if (node.InnerText.Contains("Email:")) email = node.NextSibling.InnerText;
}
这适用于电话,但由于某种原因,当“电子邮件:”节点出现时,NextSibling.InnerHTML 和NextSibling.InnerText 都是空白的,尽管下一个兄弟肯定有数据。如果我真的去details 中的node 并查看它,InnerHTML 是整个格式化链接,InnerText 是电子邮件地址。
NextSibling.InnerText 不工作是因为 A 标签使它成为一个孩子还是什么?我查看了调试器,但在NextSibling 下找不到我需要的信息。
我确信答案非常简单,我就是想不通。有人让我摆脱痛苦吗?
【问题讨论】:
-
有些单独的问题,但是如果您实际上不打算在遍历
details时使用选定的dds,为什么要选择dd元素? -
这样我就可以选择下一个兄弟姐妹。如果我不选择 DD,那么他们就不会成为下一个兄弟姐妹。
-
details的内容与节点的兄弟姐妹是什么无关,而这正是您在这里看到的。
标签: c# xpath html-agility-pack siblings