C# 在做某事之前检查节点
C# check for node before doing something
我现在搜索了大约一个小时,但显然我的搜索技巧不是最好的,所以我必须在这里问我的问题...
我正在使用 htmlAgilityPack 并且我 select 像这样的约会
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
实例的正确方法吗?
是否可以检查节点?
我可以 select 没有 运行 的节点通过 foreach 吗?
从哪里开始...首先不要每次都将 InnerHtml
解析为文档。这不仅效率低下,而且不可靠,因为 InnerHtml
可能有多个元素,而 HTML 或 XML 文档(单根)是无效的。无论如何,片段都不是文档。
我会使用 XPath 查找和 select 元素,检查特定模式或从解析的(主)文档中提取值。有很多资源,只需在 SO 或 Google 中搜索 XPath HtmlAgilityPack
(我不会发布链接,因为这些链接可能随时失效)。
select td
个节点的可能 XPath 具有您定义的相同约束:
//tr[contains(@class,'notranslate')]/td
我现在搜索了大约一个小时,但显然我的搜索技巧不是最好的,所以我必须在这里问我的问题...
我正在使用 htmlAgilityPack 并且我 select 像这样的约会
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
实例的正确方法吗?
是否可以检查节点?
我可以 select 没有 运行 的节点通过 foreach 吗?
从哪里开始...首先不要每次都将 InnerHtml
解析为文档。这不仅效率低下,而且不可靠,因为 InnerHtml
可能有多个元素,而 HTML 或 XML 文档(单根)是无效的。无论如何,片段都不是文档。
我会使用 XPath 查找和 select 元素,检查特定模式或从解析的(主)文档中提取值。有很多资源,只需在 SO 或 Google 中搜索 XPath HtmlAgilityPack
(我不会发布链接,因为这些链接可能随时失效)。
select td
个节点的可能 XPath 具有您定义的相同约束:
//tr[contains(@class,'notranslate')]/td