【问题标题】:HTML Parse no resultsHTML 解析没有结果
【发布时间】:2011-11-10 08:40:10
【问题描述】:

我正在尝试解析这个 HTML 文档以获取航班、时间、起源、日期和输出的内容。

<div id="FlightInfo_FlightInfoUpdatePanel">

<table cellspacing="0" cellpadding="0">
<tbody>
    <tr class="">
    <td class="airline"><img src="/images/airline logos/US.gif" title="US AIRWAYS. " alt="US AIRWAYS. " /></td>
    <td class="flight">US5316</td>
    <td class="codeshare">NZ46</td>
    <td class="origin">Rarotonga</td>
    <td class="date">02 Sep</td>
    <td class="time">10:30</td>
    <td class="est">21:30</td>
    <td class="status">CHECK IN CLOSING</td>
    </tr>

我正在使用此代码,基于 Windows phone 7 的 HTML Agility Pack 来查找和输出&lt;td class="flight"&gt;US5316&lt;/td&gt; 的内容

void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    var html = e.Result;

    var doc = new HtmlDocument();
    doc.LoadHtml(html);


    var node = doc.DocumentNode.Descendants("div")
        .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
        .Element("table")
        .Element("tbody")
        .Elements("tr")
        .Where(tr => tr.GetAttributeValue("td", "").Contains("class"))
        .SelectMany(tr => tr.Descendants("flight"))
        .ToArray();

    this.scrollViewer1.Content = node;  

   //Added below

   listBox1.itemSource = node;
}

我在 ScrollViewer 或 Listbox 中都没有得到任何结果。我想知道我使用的 linq 解析对于我提供的 HTML 是否正确?

【问题讨论】:

    标签: windows-phone-7 linq-to-xml html-parsing html-agility-pack


    【解决方案1】:

    你打算用这条线做什么?

    .Where(tr => tr.GetAttributeValue("td", "").Contains("class"))
    

    GetAttributeValue(name, def) 在节点中查找键为 name 的属性,如果找到该属性,则返回该属性的值。否则返回默认值def。

    所以这里实际发生的是&lt;tr&gt; 没有任何属性与键td,所以它返回默认值(一个空字符串),它不包含子字符串“类”,所以你的&lt;tr&gt; 节点正在被过滤掉。

    编辑: 这将返回一个数组,其中每个条目是一个包含每个 td 内容的 8 个字符串的数组:

    var node = doc.DocumentNode.Descendants("div")
        .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
        .Element("table")
        .Element("tbody")
        .Elements("tr")
        .Select(tr => tr.Elements("td").Select(td => td.InnerText).ToArray())
        .ToArray();
    

    例子:

    node[0][1] == "US5316"
    node[0][3] == "Rarotonga"
    

    【讨论】:

    • 感谢您提供一些建设性的反馈。我对 c# 很陌生,每天都在学习更多。我以为我从元素&lt;td&gt; 中获取了所有属性"class"。您是否有机会给我一个代码示例,该代码将返回航班、航空公司、始发地等内部的值?
    • 当然,我在那里添加了一个示例。这就是你想要做的吗?
    • 我试图从这个`Rarotonga` 和来自&lt;td class="flight"&gt;US5316&lt;/td&gt; 等的US5316 中获取这个值“Rarotonga”。作为单个值或变量然后我可以输出到文本框或列表框。谢谢你的帮助,你不知道我花了多少时间在不同的变化上。
    • 在这种情况下,每个&lt;tr&gt; 都有一个数组可能会更好。每个条目将是一个包含属性值的 8 个项目的数组。我再次编辑了答案以完成此操作。希望对您有所帮助!
    • 再次感谢您对此的帮助,今晚我将试用此代码并通知您。
    【解决方案2】:

    您正在尝试将 ScrollViewer 的内容设置为 string[](一个数组)。所以我再重复一遍,并说你应该花一些时间来学习基本的 C#,然后再继续这项工作。

    您需要做的是使用ListBox 而不是ScrollViewer,然后将ListBox.ItemSource 设置为您的node 字符串数组。

    【讨论】:

    • 我已经尝试过了,但我仍然没有得到任何输出。我意识到我可以对 c# 了解更多,但我当然有权提出问题,而无需您一直告诉我我需要学习基础知识。
    • 只是让你明白我只是在开始使用列表框和绑定之前使用滚动查看器来检查解析的结果。该数组在滚动查看器中的显示应该与在列表框中显示的相同,但是没有任何结果,因此是问题所在。如果您知道为什么string[](数组)没有显示任何结果,请随时输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多