0

xpath が機能しないという問題があります。

Google.com の検索結果リストから文字列リストに URL を取得しようとしています。

しかし、Xpath を使用して URL にアクセスできません。

私のxpathを修正するのを手伝ってください。また、??の代わりに何をすべきか教えてください。

HtmlWeb hw = new HtmlWeb();
List<string> urls = new List<string>();
HtmlAgilityPack.HtmlDocument doc = hw.Load("http://www.google.com/search?q=" +txtURL.Text.Replace(" " , "+"));
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//div[@class='f kv']");
foreach (HtmlNode linkNode in linkNodes)
{
    HtmlAttribute link = linkNode.Attributes["?????????"];
    urls.Add(link.Value);

}
for (int i = 0; i <= urls.Count - 1; i++)
{
    if (urls.ElementAt(i) != null)
    {
        if (IsValid(urls.ElementAt(i)) != true)
        {
            grid.Rows.Add(urls.ElementAt(i));

        }
    }
}
4

2 に答える 2

1

URL は、選択した のcite下の要素にあるように見えるdivため、それらを選択するための XPath は//div[@class='f kv']/cite.

ここで、これらにはマークアップが含まれていますが、テキストのみが必要なため、選択したInnerTextノードの を選択します。これらは で始まらないことに注意してくださいhttp://

HtmlNodeCollection linkNodes = 
                       doc.DocumentNode.SelectNodes("//div[@class='f kv']/cite");
foreach (HtmlNode linkNode in linkNodes)
{
    HtmlAttribute link = linkNode.InnerText;
    urls.Add(link.Value);
}
于 2013-01-30T20:20:37.563 に答える
0

正しい XPath は"//div[@class='kv']/cite". ブラウザー要素インスペクターに表示されるfクラスは、(おそらく) javascript を使用してページがレンダリングされた後に追加されます。

また、リンク テキストは属性に含まれていないため、前の手順で取得した要素のInnerTextプロパティを使用して取得できます。<div>

これらの行を変更しましたが、動作します:

var linkNodes = doc.DocumentNode.SelectNodes("//div[@class='kv']/cite");

foreach (HtmlNode linkNode in linkNodes)
{
    urls.Add(linkNode.InnerText);
}

ただし、注意点があります。一部のリンクはトリミングされています (...中央に が表示されます) 。

于 2013-01-30T20:23:04.323 に答える