WPF C# - 从页面获取链接

时间:2013-11-01 10:00:57

标签: c# html wpf parsing xaml

我想获取网页的源代码(HTML)代码,然后在我的WPF中,使用ItemsControl,我想从该html文档中获取链接。 例如, www.google.com/search?q=stackoverflow 这是网址,我想从它的HTML代码中获取所有主要链接。 我是关于C#的问候以及我正在寻找关于这个问题的内容,我无法理解,这就是为什么我请求你让我详细说明。拜托我需要你的帮忙。 感谢。

1 个答案:

答案 0 :(得分:1)

您应该查看HtmlAgilityPack库,它将帮助您获取和过滤HTML文档中的链接:

  

这是一个灵活的HTML解析器,可构建读/写DOM并支持   普通的XPATH或XSLT(你实际上并不需要理解XPATH或者   使用XSLT,不用担心......)。它是一个允许的.NET代码库   你解析“out of the web”HTML文件。解析器非常宽容   与“现实世界”格式错误的HTML。

使用HtmlAgilityPack检索HTML文档中的所有链接后,您只需将返回的链接集合(或将其转换为符合您需求的内容)绑定到ItemsSource,然后按照您希望的方式显示它们。

你会在网上找到很多不同的教程,这里有两个(不要忘记安装HtmlAgilityPack并在你的cs文件中定义正确的命名空间,安装nuget最好的方法是使用nuget,因为它建议codeplex project page):

这是一个示例,您可以使用它将所有链接URL放入单个列表框中,并假设所有内容都放在您的Window代码隐藏中(我们在这里专注于HtmlAgilityPack和WPF,而不是建筑或设计事情^^)

MainWindow.cs

  • 首先在cs文件using HtmlAgilityPack;
  • 的顶部定义此命名空间
  • 声明一个List<string>依赖项属性,该属性将包含所有显示的链接并绑定到Listbox ItemsSource
  • 然后声明触发HTML解析的按钮的Click事件回调
  • 然后声明在回调中调用GetLinks方法

这是完整的代码:

public partial class MainWindow : Window
{
    public List<string> Links
    {
        get { return (List<string>)GetValue(LinksProperty); }
        set { SetValue(LinksProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Links.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty LinksProperty =
        DependencyProperty.Register("Links", typeof(List<string>), typeof(MainWindow), new PropertyMetadata(0));

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    private List<string> GetLinks()
    {
        var links = new List<string>();
        HtmlDocument doc = new HtmlDocument();
        doc.Load("YourHtmlFileInHere");
        foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
        {
            HtmlAttribute attribute = link.Attributes["href"];
            if (attribute != null)
            {
                links.Add(attribute.Value);
            }
        }
        return links;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.Links = this.GetLinks();
    }
}

最后,您可以创建ListBoxButton来将链接列表显示在主Window中:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0"  ItemsSource="{Binding Path=Links}"></ListBox>
        <Button Grid.Row="1" Content="Get links" Click="Button_Click"></Button>
    </Grid>
</Window>

当然,这是一个非常基本的例子,Links列表内容无法更新,使用这种方式背后的代码并不是最好的事情。但是,这仍然是一个开始!