3

私が達成しようとしているのは、http://、https://、または/で始まるhref属性を持つすべてのリンクを抽出することです。これらのリンクは、特定のクラスのテーブル(tbody> tr> tdなど)内にあります。パス全体がなくても要素だけを指定できると思いましたが、機能していないようです。リンクを選択する行でNullReferenceExceptionが発生します。

var table = doc.DocumentNode.SelectSingleNode("//table[@class='containerTable']");
if (table != null)
{
    foreach (HtmlNode item in table.SelectNodes("a[starts-with(@href, 'https://')]"))
    {
        //not working

XPathに関して、推奨事項やベストプラクティスについてはわかりません。ドキュメントを2回クエリすると、オーバーヘッドが発生しますか?

4

2 に答える 2

3

使用

 //tbody/descendant::a[starts-with(@href,'https://')
                     or
                       starts-with(@href,'http://')
                     or
                       starts-with(@href,'./') 
                      ]

XmlNode.SelectNodes()インスタンスメソッドの戻り型が。XmlNodeListではなく、であるという事実を反映するようにコードを修正しない限り、問題は依然として発生HtmlNodeします。

于 2010-03-21T04:37:28.667 に答える
2

問題は、テーブルを選択し、すぐにアンカーを直接の子孫であるかのように選択しようとしていることです。真ん中にtrとタグがあります。td

したがって、xpathを次のように変更すると、次のように機能するはずです。

"tbody/tr/td/a[starts-with(@href, 'https://')]"

これは、アンカーが他の何かにラップされている場合は機能しないため、現在のノードセット(つまりテーブル)内のすべてのアンカーを選択できます。

"//a[starts-with(@href, 'https://')]"

xpath構文の詳細については、これを参照してください。

于 2010-03-20T22:28:02.647 に答える