Wie HTMLAgilityPack verwendet wird, um HTML-Daten zu extrahieren

c# html-agility-pack web-crawler

Frage

Ich lerne Web Crawler zu schreiben und fand einige großartige Beispiele, um mich zu starten, aber da ich neu bin, habe ich ein paar Fragen in Bezug auf die Codierungsmethode.

Das Suchergebnis zum Beispiel finden Sie hier: Suchergebnis

Wenn ich mir die HTML-Quelle für das Ergebnis anschaue, sehe ich Folgendes:

<HR><CENTER><H3>License Information *</H3></CENTER><HR>                                                                       
<P>                                                                                                                           
       <CENTER> 06/03/2014 </CENTER> <BR>                                                                                     
<B>Name : </B> WILLIAMS AJAYA L                     <BR>                                                                      
<B>Address : </B> NEW YORK            NY                                          <BR>                                        
<B>Profession : </B> ATHLETIC TRAINER                          <BR>                                                           
<B>License No: </B> 001475 <BR>                                                                                               
<B>Date of Licensure : </B> 01/12/07      <BR>                                                                                
                                                                                                                                <B>Additional Qualification : </B>     &nbsp; Not applicable in this profession                       <BR>                    
<B> <A href="http://www.op.nysed.gov/help.htm#status"> Status :</A></B> REGISTERED                                        <BR>
<B>Registered through last day of : </B> 08/15      <BR>

Wie kann ich das HTMLAgilityPack verwenden, um diese Daten von der Site zu verwerfen?

Ich habe versucht, ein Beispiel wie unten gezeigt zu implementieren, bin mir aber nicht sicher, wo ich die Änderung vornehmen soll, damit sie die Seite crawlen kann:

private void btnCrawl_Click(object sender, EventArgs e)
        {
            foreach (SHDocVw.InternetExplorer ie in shellWindows)
            {
                filename = Path.GetFileNameWithoutExtension( ie.FullName ).ToLower();

                if ( filename.Equals( "iexplore" ) )
                txtURL.Text = "Now Crawling: " + ie.LocationURL.ToString();
            }
            string url = ie.LocationURL.ToString();
            string xmlns = "{http://www.w3.org/1999/xhtml}";
            Crawler cl = new Crawler(url);
            XDocument xdoc = cl.GetXDocument();
            var res = from item in xdoc.Descendants(xmlns + "div")
                      where item.Attribute("class") != null && item.Attribute("class").Value == "folder-news"
                      && item.Element(xmlns + "a") != null
                      //select item;
                      select new
                      {
                          Link = item.Element(xmlns + "a").Attribute("href").Value,
                          Image = item.Element(xmlns + "a").Element(xmlns + "img").Attribute("src").Value,
                          Title = item.Elements(xmlns + "p").ElementAt(0).Element(xmlns + "a").Value,
                          Desc = item.Elements(xmlns + "p").ElementAt(1).Value
                      };
            foreach (var node in res)
            {
                MessageBox.Show(node.ToString());
                tb.Text = node + "\n";
            }
            //Console.ReadKey();                   
        }

Die Crawler-Helper-Klasse:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace CrawlerWeb
{
    public class Crawler
    {

        public string Url
        {
            get;
            set;
        }
        public Crawler() { }
        public Crawler(string Url)
        {
            this.Url = Url;
        }
        public XDocument GetXDocument()
        {
            HtmlAgilityPack.HtmlWeb doc1 = new HtmlAgilityPack.HtmlWeb();
            doc1.UserAgent = "Mozilla/4.0 (conpatible; MSIE 7.0; Windows NT 5.1)";
            HtmlAgilityPack.HtmlDocument doc2 = doc1.Load(Url);
            doc2.OptionOutputAsXml = true;
            doc2.OptionAutoCloseOnEnd = true;
            doc2.OptionDefaultStreamEncoding = System.Text.Encoding.UTF8;
            XDocument xdoc = XDocument.Parse(doc2.DocumentNode.SelectSingleNode("html").OuterHtml);
            return xdoc;
        }
    }
}

tb ist eine mehrzeilige Textbox ... Also möchte ich folgendes anzeigen:

Name WILLIAMS AJAYA L

Address NEW YORK NY

Profession ATHLETIC TRAINER

License No 001475

Date of Licensure 1/12/07

Additional Qualification Not applicable in this profession

Status REGISTERED

Registered through last day of 08/15

Ich möchte, dass das zweite Argument zu einem Array hinzugefügt wird, da der nächste Schritt wäre, in eine SQL-Datenbank zu schreiben ...

Ich bin in der Lage, die URL vom IE zu bekommen, der das Suchergebnis hat, aber wie kann ich es in meinem Skript kodieren?

Akzeptierte Antwort

Dieser kleine Ausschnitt sollte Ihnen den Einstieg erleichtern:

HtmlDocument doc = new HtmlDocument();
WebClient client = new WebClient();
string html = client.DownloadString("http://www.nysed.gov/coms/op001/opsc2a?profcd=67&plicno=001475&namechk=WIL");
doc.LoadHtml(html);

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div");

Sie verwenden grundsätzlich die WebClient Klasse, um die HTML-Datei herunterzuladen, und laden Sie dann diesen HTML- HtmlDocument in das HtmlDocument Objekt. Dann müssen Sie XPath verwenden, um die DOM-Struktur abzufragen und nach Knoten zu suchen. Im obigen Beispiel werden "Knoten" alle div Elemente im Dokument enthalten.

Hier eine kurze Referenz zur XPath-Syntax: http://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum