0

我想获取网页的源代码(HTML)代码,然后在我的 WPF 中,使用 ItemsControl 我想从该 html 文档中获取链接。例如,www.google.com/search?q=stackoverflow 是 url,我想从它的 html 代码中获取所有主要链接。我是关于 C# 的初学者,我正在寻找关于这个问题的内容,我不能很好地理解,这就是为什么我请求你让我详细做这件事。拜托我需要你的帮忙。谢谢。

4

1 回答 1

1

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

这是一个敏捷的 HTML 解析器,它构建一个读/写 DOM 并支持普通的 XPATH 或 XSLT(实际上你不必了解 XPATH 或 XSLT 就可以使用它,不用担心......)。它是一个 .NET 代码库,允许您解析“网络之外”的 HTML 文件。解析器对“真实世界”格式错误的 HTML 非常宽容。

使用 HtmlAgilityPack 从 HTML 文档中检索所有链接后,您可以简单地将返回的链接集合(或将其转换为适合您需要的内容)绑定到您的集合ItemsSource并以您想要的方式显示它们。

你会在网上找到很多不同的教程,这里有两个(不要忘记安装 HtmlAgilityPack 并在你的 cs 文件中定义适当的命名空间,安装 nuget 最好的方法是使用 nuget,因为它被推荐codeplex项目页面):

这是一个示例,您可以使用该示例将所有链接 url 放入单个列表框中,并假设所有内容都放入您的Window代码隐藏中(我们在这里关注 HtmlAgilityPack 和 WPF,而不是架构或设计问题 ^^)

在你的MainWindow.cs

  • 首先在你的cs文件顶部定义这个命名空间using HtmlAgilityPack;
  • 声明一个List<string>依赖属性,它将是包含所有显示链接的列表并绑定到您的Listbox ItemsSource
  • 然后Click为触发 HTML 解析的按钮声明事件回调
  • 然后声明在回调中调用的 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();
    }
}

最后,您可以创建 aListBox和 aButton以将链接列表显示到 main 中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列表内容无法更新,使用这种方式背后的代码并不是最好的做法。但是,这仍然是一个开始!

于 2013-11-01T10:09:08.933 回答