2016-04-20 8 views
1

Ich habe folgende HTML:HTMLAgilityPack und XPath Ziel

<table> 
    <tr> 
     <td><a href="#">Tournament Name</a> 
      <br /> Tournament Address </td> 
    </tr> 

    <tr> 
     <td><a>View Available Space and Book Online</a></td> 
    </tr> 

    <tr> 
     <td> 
      <em>Event Cost:</em> $$$ 
     </td> 

     <td> Date and Time </td> 
    </tr> 

    <tr> 

     <td> 
      <p> 
       <strong> 
        <img title="Boy's Teams can enter this tournament" /> 
        <img title="Girl's Teams can not enter this tournament" /> 
        <img title="Disabled Teams can not enter this tournament" /> 
       </strong> 
      </p> 
     </td> 

     <td> 
      TimeFrame 
     </td> 

    </tr> 

    <tr> 
     <td> 
      <img src="image.gif" /> 
      <img src="image.gif" /> 
      <img src="image.gif" /> 
      <img src="image.gif" /> 
      <img src="image.gif" /> 
      <img src="image.gif" /> 
      <img src="image.gif" /> 
      <img src="image...." /> 
      <img src="image...." /> 
      <img src="image...." /> 
      <img src="image...." /> 
     </td> 
    </tr> 
</table> 

(Diese Tabelle viele Male auf der Seite wiederholt wird).

Ich versuche, den Turniernamen zu extrahieren.

Ich habe folgende C# -Code:

namespace AcademyScraper 
{ 
    public partial class Main : Form 
    { 
     public Main() 
     { 
      InitializeComponent(); 
     } 


     private void saveBtn_Click(object sender, EventArgs e) 
     { 

      string url = "http://www.reddishvulcans.com/uk_tournament_database.asp"; 
      var Webget = new HtmlWeb(); 
      var doc = Webget.Load(url); 

      var root = doc.DocumentNode; 
      var nodes = root.Descendants(); 

      HtmlNodeCollection tableCollection = doc.DocumentNode.SelectNodes("//div[@class='infobox']/table"); 

      for (Int32 i = 0; i < tableCollection.Count(); i++) 
      { 
      HtmlNode tournamentName = tableCollection[i].SelectSingleNode("/tr[1]/td/a"); 

      MessageBox.Show(tournamentName.InnerText); 
      // I get an exception here 

      } 

     } 


    } 
} 

Das Problem, das ich habe, ist, dass egal, was ich versuche, ich kann nicht den Tag zu zielen scheinen den Turniernamen enthält. Wenn ich MessageBox.Show(tableCollection[i].OuterHTML); mache, wird der Inhalt der Tabelle in der Messagebox ohne Probleme gerendert. Allerdings erhalte ich eine Referenz-Ausnahme, wenn ich versuche, den Turniernamen zu erhalten. Basierend auf dem HTML sollte es meiner Meinung nach richtig sein.

Antwort

2

Vielleicht können Sie so etwas wie dies versuchen (Ich habe eine Konsolenanwendung, um zu versuchen):

private void saveBtn_Click(object sender, EventArgs e) 
    { 

     string url = "http://www.reddishvulcans.com/uk_tournament_database.asp"; 
     var Webget = new HtmlWeb(); 
     var doc = Webget.Load(url); 
     var aTags = doc.DocumentNode.SelectNodes("//div[@class='infobox']/table/tr/td[1]/a"); 

     foreach (var tag in aTags) 
     { 
      Console.WriteLine(tag.InnerText); 
     } 

     Console.ReadLine(); 
    } 
1

Sie haben eine Aufgabe arbeiten mit Netzwerk var doc = Webget.Load(url); kann es einige Male machen, aber Sie haben es in main thread -> Konflikt. Sie müssen die Netzwerkaufgabe in einem anderen Thread ausführen. HINWEIS ist UI-Thread (Haupt-Thread) sollten Sie es in INVOKE Delegate ausführen.

2

Die folgende XPath scheint mir gut zu funktionieren:

//div[@class='infobox']/table/tr/td[br]/a 

Konsolenanwendung demo:

string url = "http://www.reddishvulcans.com/uk_tournament_database.asp"; 
var Webget = new HtmlWeb(); 
var doc = Webget.Load(url); 

//print top 10 result just for the sake of demo 
var result = doc.DocumentNode 
       .SelectNodes("//div[@class='infobox']/table/tr/td[br]/a") 
       .Take(10); 
foreach (HtmlNode node in result) 
{ 
    Console.WriteLine(node.InnerText); 
} 

Ausgabe:

The North West Junior Champions League 2016 
PLAY AT CHELSEA - STAMFORD BRIDGE FOOTBALL TOURNAMENT 2016 
PLAY AT FC BARCELONA - CAMP NOU FOOTBALL TOUR 2016 - THE EUROPA CUP 
Silverdale Soccersevens XIX 
NORTH HALIFAX MINI SOCCER TOURNAMENT 2016 
Halton & District JFL Mini Soccer Tournament 
Colwyn Bay FC Junior Tournament 
GMCJFC Pat Mangan Festival of Football 2016 
Fred England Trophy 
Fred England Trophy