2016-04-20 7 views
1

У меня есть следующий HTML:HTMLAgilityPack и XPath Target

<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> 

(Эта таблица повторяется много раз на странице).

Я пытаюсь извлечь имя турнира .

У меня есть следующий C# код:

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 

      } 

     } 


    } 
} 

Проблема у меня, что независимо от того, что я стараюсь, я не могу целевой тег, содержащий название турнира. Если я сделаю MessageBox.Show(tableCollection[i].OuterHTML);, содержимое таблицы будет прекрасно отображаться внутри почтового ящика без проблем. Тем не менее, я получаю исключение ссылки всякий раз, когда я пытаюсь получить имя турнира. Основываясь на HTML, я думаю, что это должно быть правильно.

ответ

2

Может быть, вы можете попробовать что-то вроде этого (я создал приложение консоли, чтобы попытаться):

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

У вас есть работа с сетью var doc = Webget.Load(url);, это можно сделать несколько раз, но вы получили ее в main thread -> конфликте. Вам нужно запустить сетевую задачу в другом потоке. ПРИМЕЧАНИЕ. MessageBox.Show(tournamentName.InnerText); - это поток пользовательского интерфейса (основной поток), который вы должны запустить в делегате INVOKE.

2

Следующая XPath, кажется, работает хорошо для меня:

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

Консоль приложения 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); 
} 

мощность:

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 
Смежные вопросы