我想获取网页的源代码(HTML)代码,然后在我的 WPF 中,使用 ItemsControl 我想从该 html 文档中获取链接。例如,www.google.com/search?q=stackoverflow 是 url,我想从它的 html 代码中获取所有主要链接。我是关于 C# 的初学者,我正在寻找关于这个问题的内容,我不能很好地理解,这就是为什么我请求你让我详细做这件事。拜托我需要你的帮忙。谢谢。
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
列表内容无法更新,使用这种方式背后的代码并不是最好的做法。但是,这仍然是一个开始!