2017-10-30 19 views
0

私はそのページから情報を取得しようとしている:要素を検査する際http://www.wowhead.com/transmog-sets?filter=3;5;0#transmog-sets解析ノード

行は次のようになります。 InspectElement

私はこのコードを試してみたが、それはすべてのnullを私に返します任意のノードでの時刻:

public class ItemSetsTransmog 
       { 
        public string ItemSetName { get; set; } 
        public string ItemSetId { get; set; } 
       } 

       public partial class Fmain : Form 
       { 
        DataTable Table; 
        HtmlWeb web = new HtmlWeb(); 

        public Fmain() 
        { 
         InitializeComponent(); 
         initializeItemSetTransmogTable(); 

        } 

        private async void Fmain_Load(object sender, EventArgs e) 
        { 
         int PageNum = 0; 
         var itemsets = await ItemSetTransmogFromPage(0); 
         while (itemsets.Count > 0) 
         { 
          foreach (var itemset in itemsets) 
           Table.Rows.Add(itemset.ItemSetName, itemset.ItemSetId); 

          itemsets = await ItemSetTransmogFromPage(PageNum++); 
         } 

        } 

        private async Task<List<ItemSetsTransmog>> ItemSetTransmogFromPage(int PageNum) 
        { 
         String url = "http://www.wowhead.com/transmog-sets?filter=3;5;0#transmog-sets"; 
         if (PageNum != 0) 
          url = "http://www.wowhead.com/transmog-sets?filter=3;5;0#transmog-sets:75+" + PageNum.ToString(); 

         var doc = await Task.Factory.StartNew(() => web.Load(url)); 
         var NameNodes = doc.DocumentNode.SelectNodes("//*[@id=\"tab - transmog - sets\"]//div//table//tr//td//div//a"); 
         var IdNodes = doc.DocumentNode.SelectNodes("//*[@id=\"tab - transmog - sets\"]//div//table//tr//td//div//a"); 

         // if these are null it means the name/score nodes couldn't be found on the html page 
         if (NameNodes == null || IdNodes == null) 
          return new List<ItemSetsTransmog>(); 

         var ItemSetNames = NameNodes.Select(node => node.InnerText); 
         var ItemSetIds = IdNodes.Select(node => node.InnerText); 

         return ItemSetNames.Zip(ItemSetIds, (name, id) => new ItemSetsTransmog() { ItemSetName = name, ItemSetId = id }).ToList(); 
        } 

        private void initializeItemSetTransmogTable() 
        { 
         Table = new DataTable("ItemSetTransmogTable"); 
         Table.Columns.Add("ItemSetName", typeof(string)); 
         Table.Columns.Add("ItemSetId", typeof(string)); 

         ItemSetTransmogDataView.DataSource = Table; 
        } 
       } 
      } 

なぜ私のスクリプトはこれらのノードをロードしないのですか?どうすれば修正できますか?

答えて

1

これらのノードは、HTMLアジリティパックによってプルバックされたHTMLには存在しないため、これらのノードはロードされません。これはおそらく、マークアップの大部分がJavaScriptによって生成されたためです。 ItemSetTransmogFromPage()メソッドのdoc.ParsedTextプロパティを調べてみてください。

Html Agility PackはHTTPクライアント/パーサーであり、スクリプトを実行しません。このプロセスを使用して実際にデータを取得する必要がある場合は、Optimusなどの「ヘッドレスブラウザ」を使用してページを取得する必要があります(注意:私はこのライブラリを使用していませんが、 HTML Agility Packを使用して、マークアップを解析/照会します。

もう1つの方法は、このページに存在するJSONを解析することです(必要なデータがあれば、これはそうではありませんが)。

小型ノート - 「 - transmog - セットタブ」

+1

おかげで、私はあなたのidは、XPathの代わりに、「タブtransmogセット」すべきだと思います!私はページをJsonに変換しましたが、それはうまくいきました。 –

関連する問題