Web ページのソース (HTML) コードを取得してから、WPF で ItemsControl を使用して、その html ドキュメントからリンクだけを取得したいと考えています。たとえば、www.google.com/search?q=stackoverflow は URL であり、その html コードからすべての主要なリンクを取得したいと考えています。私はC#の初心者で、この質問について何を探しているのですか、よく理解できないので、これを詳しく教えてください。お願いします、あなたの助けが必要です。ありがとう。
1 に答える
HtmlAgilityPackライブラリを確認してください。これは、HTML ドキュメントからリンクを取得してフィルタリングするのに役立ちます。
これは、読み取り/書き込み DOM を構築し、プレーンな XPATH または XSLT をサポートするアジャイル HTML パーサーです (実際には、使用するために XPATH や XSLT を理解する必要はありません。心配はいりません...)。これは、「Web から」HTML ファイルを解析できる .NET コード ライブラリです。パーサーは、「実際の」不正な HTML に対して非常に寛容です。
HtmlAgilityPack を使用して HTML ドキュメントからすべてのリンクを取得したら、返されたリンク コレクションをバインド (またはニーズに合ったものに変換) して、必要なItemsSource
方法で表示することができます。
ウェブ上にはさまざまなチュートリアルがたくさんあります。そのうちの 2 つを次に示します (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
リストの内容を更新することはできず、コード ビハインドをそのように使用することは最善の方法ではありません。それでも、これは始まりです!