7

我正在尝试从 HTML 文档中用一段简单的 C# 解析出证券交易所信息。问题是我无法理解语法,tr class="LomakeTaustaVari"被解析出来但是我如何获得没有 tr-class 的第二位?

这是一段 HTML,它以不同的值自我重复。

<tr class="LomakeTaustaVari">
    <td><div class="Ensimmainen">12:09</div></td>
    <td><div>MSI</div></td>
    <td><div>POH</div></td>
    <td><div>42</div></td>
    <td><div>64,50</div></td>
</tr>
<tr>
    <td><div class="Ensimmainen">12:09</div></td>
    <td><div>SRE</div></td>
    <td><div>POH</div></td>
    <td><div>156</div></td>
    <td><div>64,50</div></td>
</tr>

我的 C# 代码:

{
    HtmlAgilityPack.HtmlWeb web = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = web.Load ("https://www.op.fi/op/henkiloasiakkaat/saastot-ja-sijoitukset/kurssit-ja-markkinat/markkinat?sivu=alltrades.html&sym=KNEBV.HSE&from=10:00&to=19:00&id=32453");

    foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//tr[@class='LomakeTaustaVari']")) 
    {
        Console.WriteLine(row.InnerText);     
    }
    Console.ReadKey();
}
4

5 回答 5

5

尝试使用下一个 xpath //tr[preceding-sibling::tr[@class='LomakeTaustaVari']]

var nodes = doc.DocumentNode.SelectNodes("//tr[preceding-sibling::tr[@class='LomakeTaustaVari']]");

tr它应该选择具有类的前面节点的节点LomakeTaustaVari

仅供参考:如果未找到节点,则SelectNodes方法返回null.

于 2013-10-16T14:29:59.867 回答
2

如果您设法获得对该<tr class="LomakeTaustaVari">元素的引用,我会看到两种可能的解决方案。

您可以导航到父级,然后找到它的所有<tr>子级:

lomakeTaustaVariElement.Parent.SelectNodes("tr"); // iterate over these if needed

您还可以使用NextSibling获取下一个<tr>

var trWithoutClass = lomakeTaustaVariElement.NextSibling;

请注意,使用第二种选择可能会遇到问题,因为 HTML 中存在的空格可能会被解释为不同的元素。

为了克服这个问题,您可以递归调用NextSibling直到遇到一个tr元素。

于 2013-10-16T14:12:10.347 回答
1

这将遍历文档中的所有节点。您可能还需要更具体地指定起始节点,因此您将只选择您感兴趣的。

foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//tr")) 
{
    Console.WriteLine(row.InnerText);     
}
于 2013-10-16T14:10:42.570 回答
0

可能我什么都不懂,但是任何tr元素选择的最简单的 XPath 应该可以完成工作:

doc.DocumentNode.SelectNodes("//tr")

否则,如果您只想选择具有特定属性的元素,则可能是:

doc.DocumentNode.SelectNodes("//tr[@class = 'someClass1' or @class = 'someClass2']")
于 2013-10-16T14:10:19.753 回答
0

如果您不喜欢加载页面并想使用准备好的html字符串,例如来自WebBrowser元素,您可以使用以下示例:

var web = new HtmlAgilityPack.HtmlDocument();
web.LoadHtml(webBrowser1.Document.Body.Parent.OuterHtml);
var q = web.DocumentNode.SelectNodes("/html/body/div[2]/div/div[1]") //XPath /html/body/div[2]/div/div[1]
于 2021-03-04T08:19:03.027 回答