【问题标题】:HTML Parsing c#c# HTML解析
【发布时间】:2011-11-09 16:12:23
【问题描述】:

我正在解析一个 HTML 文件并遇到了一些问题。

我正在使用以下代码:

编辑************************************

更新的代码现在可以工作了。

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) {

    WebClient client = new WebClient();
    client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);

    client.DownloadStringAsync(new Uri(@"http://www.SourceURL.com"));

}

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

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

    var list = doc.DocumentNode.Descendants("div").ToList();


    var node = doc.DocumentNode.Descendants("div")
        .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
        .Element("table")
        .Element("tbody")
        .Elements("tr").Aggregate("Flight list\n", (acc, n) => acc + "\n" + n.InnerHtml);
       // .Elements("td")

    this.scrollViewer1.Content = node;




       }

    }
}

这给了我这个结果。

现在所有结果都按要求显示。

我的问题是:如何更改此代码以显示所有 <tr>'s 下的所有结果

编辑############################ XAML

ListBox Margin="6,6,-12,0" Name="listBox1">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Margin="0,0,0,17" Width="432" Height="Auto">

                            <TextBlock Text="{Binding Flight}" Foreground="#FF4BCCF5" FontSize="24" />
                            <TextBlock Text="{Binding Origin}" TextWrapping="Wrap" FontSize="22" Foreground="#FF969696" />
                            <TextBlock Text="{Binding Date}" TextWrapping="Wrap" FontSize="20" Foreground="#FF05C16C" />
                            <TextBlock Text="{Binding Time}" TextWrapping="Wrap" FontSize="20" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

【问题讨论】:

  • 你的元素应该在 tr 而不是 td 上。你不会在第一个 tr 中所有 trs 不是所有 tds 紧吗?

标签: c# html parsing windows-phone-7 html-agility-pack


【解决方案1】:
var node = doc.DocumentNode.Descendants("div")
    .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
    .Element("table")
    .Element("tbody")
    .Descendants("tr").ToArray();

this.textBlock2.Text = string.Join(Environment.NewLine, node.Select(tr => tr.InnerHtml));

你可以通过

得到所有的行
var node = doc.DocumentNode.Descendants("div")
    .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
    .Element("table")
    .Element("tbody");

    if (node != null)
    {
       this.textBlock2.Text = node.InnerHtml;
    }

【讨论】:

  • 谢谢,但这会在 list.Descendants 和 x.Id 上显示代码错误,说 Error 1 The type 'HtmlAgilityPack.HtmlNode' cannot be used as type parameter 'T' in the generic type or method 'System.Xml.Linq.Extensions.Descendants&lt;T&gt;(System.Collections.Generic.IEnumerable&lt;T&gt;, System.Xml.Linq.XName)'. There is no implicit reference conversion from 'HtmlAgilityPack.HtmlNode' to 'System.Xml.Linq.XContainer'.
  • 我很困惑,您刚刚添加了我已经在使用的代码,但 list.descendants 仍然存在问题,因为它似乎对 Windows Phone 的 HTML Agility Pack 无效
  • 对于第二个代码,没有声明值。首先,我将如何输出结果?
  • 刚刚测试过..Error 1 The best overloaded method match for 'string.Join(string, string[])' has some invalid arguments Error 2 Argument 2: cannot convert from 'System.Collections.Generic.IEnumerable&lt;string&gt;' to 'string[]' 非常感谢您帮助我。
【解决方案2】:

假设您有与使用 XElement 时相同的方法,这应该可以解决问题

var text = list.Descendants("div")
                 .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
                 .Element("table")
                 .Element("tbody")
                 .Descendants("tr").Aggregate("",(acc,n)=>acc+"\n"+n.OuterHtml);

 this.textBlock2.Text = text;

【讨论】:

  • 我认为 String.Join 比使用 Aggregate 函数更简洁。
  • @Claus måske,måske ikke。我会说“这取决于”对我来说,上述内容很清楚。代码读取为您将如何解决任务。找到我这些元素,因为它们每个都连接 InnerHtml。使用字符串,它读起来更像:在每个或我要提供的字符串之间插入“\n”,可以像这样找到字符串
  • gist.github.com/1190957 ,我认为这样做的意图要清楚得多。
  • @Claus 是的,我只是指出对我来说不是。有一个 FP 背景阅读折叠(聚合)它非常具有描述性。因此,这又取决于,具体而言,它取决于谁阅读了代码,还取决于在代码 bsae 中执行此类操作的常用方法是什么
  • @Claus 我们在这里讨论的是一个 HTML 表格,您是否真的相信会有这么多的 trs,以至于 潜在的 开销是一个性能问题?我还没有查看聚合的实现,但可以优化该实现,以便上面(几乎)等于 a + b + c + d + c,这实际上与连接一样快。我不认为是这种情况,但除非您在代码的特定上下文中实际测量出明显的性能差异,否则不要将其用作参数。过早优化带来的问题比它解决的问题多得多。
猜你喜欢
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多