19

<li>ドキュメント内のすべての要素が選択されるのはなぜですか?

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);

var travelList = new List<Page>();
var liOfTravels = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']")
                     .SelectNodes("//li");

私が望むのは、「myTrips」のすべての要素を取得することです<li><div>id

4

5 に答える 5

17
var liOfTravels = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']")
                 .SelectNodes(".//li");

2 行目のドットに注意してください。基本的にこの点に関して、HTMLAgitilityPack は XPath 構文に完全に依存していますが、これらのクエリは事実上同じであるため、結果は直感的ではありません。

doc.DocumentNode.SelectNodes("//li");
some_deeper_node.SelectNodes("//li");
于 2013-01-20T12:24:26.847 に答える
17

IDが「myTrips」のdivでのみselectNodesを実行すると予想しているため、少し混乱しますが、別のSelectNodes( "//li")を実行すると、ドキュメントの上部から別の検索が実行されます.

ステートメントを 1 つにまとめることでこれを修正しましたが、それは ID "mytrips" を持つ div が 1 つしかない Web ページでのみ機能します。クエリは次のようになります。

doc.DocumentNode.SelectNodes("//div[@id='myTrips'] //li");

于 2012-05-14T13:32:01.683 に答える
7

新しいノードを作成すると、状況によっては有益な場合があり、xpath をより直感的に使用できるようになります。これはいくつかの場所で役立つことがわかりました。

var myTripsDiv = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']");
var myTripsNode = HtmlNode.CreateNode(myTripsDiv.InnerHtml);
var liOfTravels = myTripsNode.SelectNodes("//li");
于 2015-10-02T15:57:49.420 に答える
4

これは、Linq クエリで実行できます。

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);

var travelList = new List<HtmlNode>();
foreach (var matchingDiv in doc.DocumentNode.DescendantNodes().Where(n=>n.Name == "div" && n.Id == "myTrips"))
{
    travelList.AddRange(matchingDiv.DescendantNodes().Where(n=> n.Name == "li"));
}

役立つことを願っています

于 2012-05-14T14:28:29.340 に答える
2

これは私にも直観に反するように思えますselectNodes。特定のノードでメソッドを実行すると、ドキュメント全体ではなく、そのノードの下のもののみが検索されると思いました。

とにかく、この行を変更するとOP:

var liOfTravels = 
doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']").SelectNodes("//li");

に:

var liOfTravels = 
doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']").SelectNodes("li");

大丈夫だと思います。同じ問題が発生したばかりで、それで修正されました。Liがあなたが持っているノードの直接の子でなければならないかどうかはわかりません。

于 2012-06-12T22:53:54.673 に答える