XPath / HtmlAgilityPack:如何查找具有屬性(href)的特定值的元素(a)並查找相鄰的表列?

c# html html-agility-pack visual-studio xpath

我非常絕望,因為我無法弄清楚如何實現我在問題中所說的內容。我已經閱讀了無數類似的例子,但沒有找到一個在確切情況下工作的例子。所以,假設我有以下代碼:

<table><tr>
<td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td>
<td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td>
<td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td>
</tr></table>

現在,我已經擁有的是url-a的一部分。我基本上想知道如何獲得id和img A.我正在嘗試用XPath“找到”這條線,但我無法找到一種方法來使它工作。此外,信息可能根本不存在。這是我最近的一次嘗試(嚴肅的說,我現在已經嘗試了很多不同的方法,已經超過3個小時了。)

<table><tr>
<td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td>
<td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td>
<td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td>
</tr></table>

嗯,這顯然是錯的,所以如果有人可以幫助我,我會很高興。此外,如果有人能夠通過這樣的示例向我指出一些解釋XPath和符號/語法的網站,我也會感激不盡。書籍也歡迎。

PS:我知道我可以在沒有XPath的情況下實現我的目標,使用Regex或只是簡單的C#中的StreamReader,並檢查每行是否包含我需要的內容但是a)它太脆弱了我的需求,因為代碼可能有突然的換行符和b)我真的想要堅持完全堅持XPath,因為我在這個項目中正在做的事情。

在此先感謝您的幫助!

一般承認的答案

使用以下XPath表達式

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

根據提供的(格式錯誤但已更正的)XML文檔進行評估時

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

選擇了想要的文本節點

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

同樣,這個XPath表達式

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

當針對相同的XML文檔(上面)進行評估時,選擇另一個想要的文本節點

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

基於XSLT的驗證

在XML文檔上應用此轉換時 (上圖):

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

產生了想要的結果

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

熱門答案

你有一個嚴重破壞的HTML與不匹配的關閉td標籤。請修理它們。這個標記只是一張醜陋的畫面。

希望Html Agility Pack可以處理你拋出的任何垃圾,所以這裡是如何繼續解析你的垃圾並找到給定hrefidimg值:

class Program
{
    static void Main()
    {
        var doc = new HtmlDocument();
        doc.Load("test.html");
        var anchor = doc.DocumentNode.SelectSingleNode("//a[contains(@href, 'url-a')]");
        if (anchor != null)
        {
            var id = anchor.ParentNode.SelectSingleNode("following-sibling::td/a");
            if (id != null)
            {
                Console.WriteLine(id.InnerHtml);
                var img = id.ParentNode.SelectSingleNode("following-sibling::td/a");
                if (img != null)
                {
                    Console.WriteLine(img.InnerHtml);
                }
            }
        }
    }
}



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因