在做某事之前C#检查节点

时间:2016-03-04 00:40:40

标签: c# html-agility-pack

我现在正在寻找大约一个小时,但显然我的搜索技巧不是最好的,所以我不得不在这里问我的问题......

我正在使用htmlAgilityPack,我选择了这样的日期

HtmlAgilityPack.HtmlDocument htmlDoc        = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlDocument htmlDocTDs     = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlDocument htmlDocLink    = new HtmlAgilityPack.HtmlDocument();


htmlDoc.LoadHtml(webBrowser1.DocumentText);

var nodes = htmlDoc.DocumentNode.Descendants("tr").Where(d => d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("notranslate"));

有了这个我最终在这里结束了很多

<tr class="notranslate">
    <td class="hideid">1234567</td>
    <td><a href="/xxx/xxx/xxx-x.xxxx.xxx">aaa-a.aaaaaa.aaa</a></td>
    <td class="mobileHide">cccc</td>
    <td>xx.xxx.xxx.xx</td>
    <td>Mar. 03, 2016 3:43 AM</td>
</tr>

现在继续,我循环它们因为我想得到所有节点的innerHtml

foreach (HtmlNode node in nodes)
{
    htmlDocTDs.LoadHtml(node.InnerHtml);
    var tds = htmlDocTDs.DocumentNode.Descendants("td");

    foreach (HtmlNode td in tds)
    {
        htmlDocLink.LoadHtml(td.InnerHtml);
        //... here i got stuck
    }
}    

现在实际上我不想要<a href="..">...</a>我也想要这个元素的innerHtml。现在我要做的是检查当前td块是否有a标记,如果是,请获取其innerHtml

由于我对C#的相对较新,我不太清楚如何做到这一点。

这是创建htmlDoc个实例的正确方法吗?

是否有可能检查节点?

我可以选择一个节点而无需通过foreach运行吗?

1 个答案:

答案 0 :(得分:1)

从哪里开始......首先不要每次都将InnerHtml解析为文档。这不仅非常低效,而且不可靠,因为InnerHtml可能有多个元素,这些元素作为HTML或XML文档(单根)无效。反正片段不是文件。

我使用XPath来查找和选择元素,检查特定模式或从解析的(主)文档中提取值。有足够的资源,只需在SO或Google上搜索XPath HtmlAgilityPack(我没有发布链接,因为这些链接可能随时变得无效)。

可能的XPath选择具有您定义的相同约束的td节点:

//tr[contains(@class,'notranslate')]/td