#

 

 

Dieses Beispiel zeigt eine WPF Anwenung mit C# Code, welche eine Webseite ausliest und die darin enthaltenen Details ausliest.

Dabei wird ein WebRequest, ein HttpWebresponse verwendet und die HTML Webseite mit dem HTMLAgilityPack ausgewertet.

 

Vorbereitung:

Zum Arbeiten mit HTML Dokumenten in WPF sollte man das HtmlAgilityPack von ZZZ Projects herunterladen und installieren.

Hierzu auf Referenzes->Manage NuGet Packages

This is an agile HTML parser that builds a read/write DOM and supports plain XPATH or XSLT (you actually don't HAVE to understand XPATH nor XSLT to use it, don't worry...). It is a .NET code library that allows you to parse "out of the web" HTML files. The parser is very tolerant with "real world" malformed HTML. The object model is very similar to what proposes System.Xml, but for HTML documents (or streams).

Danach befindet sic hunter den References ein Eintrag mit

HtmlAgilityPack

 

Grundlage: HTML Dokument

 

Alle Webseiten im Internet basieren auf einem HTML Dokument.

Man kann dieses einsehen, wenn man im Browser mit F12 oder der Rechten Maustaste eine Position in der Webseite mit Untersuchen anzeigen lässt.

In diesem Beispiel sollen alle zeilen als Ergebnisse einer Webseiten-Liste gelesen werden, welche zu einem Detailsatz führen.

 

Alle Elemente werden in Html Dokument als Nodes verarbeitet.

 

Dabei muss das Div-HTML Element mit der Class=Job-Details gefunden werden und darunter der passende Link zur Unterwebseite.

<div class="job-details">

 

Der Link wird mit a href als Desendant Element geführt.

<a href="/de/job/eDiscovery-Helpdesk-Supervisor-Washington-D-C--1/">eDiscovery Helpdesk Supervisor - Washington, D.C. </a>

 

 

 

 

Anwendung:

Wenn man das WPF Programm mit dem Startbutton startet, dann wird zunächst im ersten Schritt das HTML Dokument der Webseite heruntergeladen.

Im zweiten Schritt wird das Html-Dokument nach den gesuchten Nodes untersucht.

 

Im Ersten Schritt wird das Html Dokument heruntergeladen

 

Hierzu verwende ich die folgende C# Code Methode fx_read_Page(URL)

Der Code erstellt zunächst einen Webrequest und leitet hierauf eine WebResponse ab

//< WebRequest and Response >

WebRequest objRequest = WebRequest.Create(sURL);

HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

//</ WebRequest and Response >

 

Dann lädt es den Text herunter in einen Stream

//< Stream and Reader >

Stream objDataStream = objResponse.GetResponseStream();

StreamReader TextReader = new StreamReader(objDataStream);

//</ Stream and Reader >

string sHTML = TextReader.ReadToEnd();

 

Und übergibt diesen in ein locales HtmlDocument

//*create and load to local HtmlDocument

HtmlDocument doc = new HtmlDocument();

doc.LoadHtml (sHTML);

 

Methode fx_read_Page(string sURL)

private HtmlAgilityPack.HtmlDocument fx_read_Page(string sURL)

        {

            //------------< fx_read_Page() >------------

            //* get the HTML Document of a website-URL     

            //-< init >-

            //< WebRequest and Response >

            WebRequest objRequest = WebRequest.Create(sURL);

            HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

            //</ WebRequest and Response >

 

            //< Stream and Reader >

            Stream objDataStream = objResponse.GetResponseStream();

            StreamReader TextReader = new StreamReader(objDataStream);

            //</ Stream and Reader >

            //-</ init >-

 

            //< download >

            //* Read Website to local String

            string sHTML = TextReader.ReadToEnd();

            //</ download >

 

            //< get HTMLdocument >

            //*create and load to local HtmlDocument

            HtmlDocument doc = new HtmlDocument();

            doc.LoadHtml (sHTML);

            //</ get HTMLdocument >

 

            //< output >

            return doc;

            //</ output >

            //------------</ fx_read_Page() >------------

        }

 

 

Auswerten des HTML Dokuments

Danach wird das Html Dokument nach den Nodes untersucht

 

Zunächst werden alle Li-Html Element gesammelt mit der Class=Job-Result-Item

//< nodes >

HtmlNodeCollection  nodes = doc.DocumentNode.SelectNodes("//li[@class=\"job-result-item\"]"); //*find subnode with //

//</ nodes >

 

Hieraus wird jeder Treffer durchlaufen und nach dem ersten Unterelement vom Typ Div und der Css Klasse Job-Title gesucht

HtmlNode nodeTitle = node.SelectSingleNode(".//div[@class=\"job-title\"]");

 

Aus diesem Detail-Element wird dann der Titel und der Link ermittelt

HtmlNode node_to_Detail = nodeTitle.SelectSingleNode("a");

                    string sTitle = node_to_Detail.InnerText;

                    string sURL_Detail_relative = node_to_Detail.GetAttributeValue("href", "");

                    string sURL_Detail_absolute = new Uri(baseUrl, sURL_Detail_relative).AbsoluteUri ;

 

 

 

Html Nodes auswerten

//< nodes >

            HtmlNodeCollection  nodes = doc.DocumentNode.SelectNodes("//li[@class=\"job-result-item\"]"); //*find subnode with //

            //</ nodes >

 

            //------< @Loop: Detail Nodes >------

            foreach (HtmlNode node in nodes )

            {

                //----< In Detail-Node >----

                HtmlNode nodeTitle = node.SelectSingleNode(".//div[@class=\"job-title\"]"); //*find subnode with .//

                if (nodeTitle !=null)

                {

                    //--< get a_href >--

                    HtmlNode node_to_Detail = nodeTitle.SelectSingleNode("a");

                    string sTitle = node_to_Detail.InnerText;

                    string sURL_Detail_relative = node_to_Detail.GetAttributeValue("href", "");

                    string sURL_Detail_absolute = new Uri(baseUrl, sURL_Detail_relative).AbsoluteUri ;

 

                    //< print >

                    fx_Log(sTitle);

                    //</ print >

                    //--</ get a_href >--

                }

                //----</ In Detail-Node >----

            }

            //------</ @Loop: Detail Nodes >------

 

 

 

 

Komplettes Code-Beispiel in C#

using System;

using System.Collections.Generic;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

//< add using >

using System.IO;                //*Stream, Streamreader

using System.Net;               //*NetRequest

using HtmlAgilityPack;   //*Html Website

//</ add using >

 

namespace WebRobot_ComputerFutures

{

 

    public partial class MainWindow : Window

    {

 

 

        #region Form

        //--------------------< region: Form >---------------------

        public MainWindow()

        {

            InitializeComponent();

        }

        //--------------------</ region: Form >---------------------

        #endregion /Form

 

 

        #region Buttons

        //--------------------< region: Buttons >---------------------

        private void Button_Start_Click(object sender, RoutedEventArgs e)

        {

            //--------< Button_Start_Click() >--------

            string sURL = Textbox_URL.Text;

            var baseUrl = new Uri(sURL);

 

            HtmlDocument doc= fx_read_Page(sURL );

 

            //< nodes >

            HtmlNodeCollection  nodes = doc.DocumentNode.SelectNodes("//li[@class=\"job-result-item\"]"); //*find subnode with //

            //</ nodes >

 

            //------< @Loop: Detail Nodes >------

            foreach (HtmlNode node in nodes )

            {

                //----< In Detail-Node >----

                HtmlNode nodeTitle = node.SelectSingleNode(".//div[@class=\"job-title\"]"); //*find subnode with .//

                if (nodeTitle !=null)

                {

                    //--< get a_href >--

                    HtmlNode node_to_Detail = nodeTitle.SelectSingleNode("a");

                    string sTitle = node_to_Detail.InnerText;

                    string sURL_Detail_relative = node_to_Detail.GetAttributeValue("href", "");

                    string sURL_Detail_absolute = new Uri(baseUrl, sURL_Detail_relative).AbsoluteUri ;

 

                    //< print >

                    fx_Log(sTitle);

                    //</ print >

                    //--</ get a_href >--

                }

                //----</ In Detail-Node >----

            }

            //------</ @Loop: Detail Nodes >------

            //--------</ Button_Start_Click() >--------

        }

        //--------------------</ region: Buttons >---------------------

        #endregion /Buttons

 

 

 

        #region Methods

        //--------------------< region: Methods >---------------------

        private HtmlAgilityPack.HtmlDocument fx_read_Page(string sURL)

        {

            //------------< fx_read_Page() >------------

            //* get the HTML Document of a website-URL     

            //-< init >-

            //< WebRequest and Response >

            WebRequest objRequest = WebRequest.Create(sURL);

            HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

            //</ WebRequest and Response >

 

            //< Stream and Reader >

            Stream objDataStream = objResponse.GetResponseStream();

            StreamReader TextReader = new StreamReader(objDataStream);

            //</ Stream and Reader >

            //-</ init >-

 

            //< download >

            //* Read Website to local String

            string sHTML = TextReader.ReadToEnd();

            //</ download >

 

            //< get HTMLdocument >

            //*create and load to local HtmlDocument

            HtmlDocument doc = new HtmlDocument();

            doc.LoadHtml (sHTML);

            //</ get HTMLdocument >

 

            //< output >

            return doc;

            //</ output >

            //------------</ fx_read_Page() >------------

        }

 

        //--------------------</ region: Methods >---------------------

        #endregion /Methods

 

 

 

 

 

 

        #region Sys

        //--------------------< region: Sys >---------------------

        private void fx_Log (string sLog)

        {

            //------------< fx_Log() >------------

            //* log Text to Textbox

            string sText = Textbox_Log.Text;

            sText = DateTime.Now + " " + sLog + Environment.NewLine + sText ;

            if (sText.Length > 50000) { sText = sText.Substring(50000); }

            Textbox_Log.Text = sText;

            Textbox_Log.UpdateLayout();

            //------------</ fx_Log() >------------

        }

 

        //--------------------</ region: Sys >---------------------

        #endregion /Sys

    }

}

 

 

 

 

XAML Frontend

Folgend der Xaml Code zum Frontend der WPF Anwendung.

 

Darin befindet sich der Button zum Starten, eine Textbox zum eingeben der URL und eine Textbox zum Anzeigen der Ergebnisse.

<Window x:Class="WebRobot_ComputerFutures.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:WebRobot_ComputerFutures"

        mc:Ignorable="d"

        Title="MainWindow" Height="550" Width="720">

    <Grid>

 

        <Label x:Name="Label_URL" Content="Url:" HorizontalAlignment="Left" Margin="30,46,0,0" VerticalAlignment="Top"/>

        <TextBox x:Name="Textbox_URL" HorizontalAlignment="Left" Height="23" Margin="30,72,0,0" TextWrapping="Wrap" Text="https://www.computerfutures.com/jobs/temporary/?locale=de" VerticalAlignment="Top" Width="658"/>

 

        <Label x:Name="Label_Log" Content="log:" HorizontalAlignment="Left" Margin="29,100,0,0" VerticalAlignment="Top"/>

        <TextBox x:Name="Textbox_Log" HorizontalAlignment="Left" Height="385" Margin="29,126,0,0" TextWrapping="Wrap" Text=".." VerticalAlignment="Top" Width="659"/>

        <Button x:Name="Button_Start" Content="Start" HorizontalAlignment="Left" Margin="29,10,0,0" VerticalAlignment="Top" Width="75"

                Click="Button_Start_Click"

                />

 

 

    </Grid>

</Window>

 

  Webscraper, Webrobot

 
Video Tutorial
https://www.youtube.com/watch?v=zAn971uz2yg

 

Mobile

.

yesmovies