Skip to main content
 首页 » 编程设计

c#之HTMLAgilityPack 和 XPath 目标

2024年06月03日9thcjp

我有以下 HTML:

<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,我认为它应该是正确的。

请您参考如下方法:

也许你可以尝试这样的事情(我创建了一个控制台应用程序来尝试):

 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(); 
    }