我想获取网页的源代码(HTML)代码,然后在我的WPF中,使用ItemsControl,我想从该html文档中获取链接。 例如, www.google.com/search?q=stackoverflow 这是网址,我想从它的HTML代码中获取所有主要链接。 我是关于C#的问候以及我正在寻找关于这个问题的内容,我无法理解,这就是为什么我请求你让我详细说明。拜托我需要你的帮忙。 感谢。
答案 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
:
using HtmlAgilityPack;
List<string>
依赖项属性,该属性将包含所有显示的链接并绑定到Listbox
ItemsSource
Click
事件回调这是完整的代码:
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();
}
}
最后,您可以创建ListBox
和Button
来将链接列表显示在主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
列表内容无法更新,使用这种方式背后的代码并不是最好的事情。但是,这仍然是一个开始!