2015-05-06 210 views
0

我有點鹹菜。有一張我想在網站上抓取的圖像列表。我知道如何做到這一點,但我必須過濾出圖像的位置。標籤中的C#HTML標籤

如我想要抓住一個ID爲「theseImages」的div標籤中的圖像,但另一個div標籤中有另一組圖像,其ID爲「notTheseImages」。將每個標籤循環到具有標籤「img」的HtmlElementCollection中,將忽略div,因爲它也會從「notTheseImages」中獲取圖像。

有沒有一種方法可以循環顯示圖像,同時檢查這些圖像在div標籤中的位置?

+0

您使用的,您使用與WebBrowser組件的WinForms什麼?如果是這樣,你可以得到div本身,然後循環到childcollection獲得有問題的圖像,你可以顯示一些代碼,並顯示你到目前爲止嘗試過嗎? (我也是一個小菜一碟:D) – Icepickle

+4

請顯示一些代碼 –

+0

使用CSQuery(它有jQuery風格的選擇器)可以很容易地從網頁的HTML中分離出集合。最好展示你已經嘗試的HTML和代碼。 :) –

回答

0

這可以幫助你做你的當前HTML的選擇,也許對未來occassions :)

protected HtmlElement[] GetElementsByParent(HtmlDocument document, HtmlElement baseElement = null, params string[] singleSelectors) 
{ 
    if (singleSelectors == null || singleSelectors.Length == 0) 
    { 
     throw new Exception("Please give at least 1 selector!"); 
    } 
    IList<HtmlElement> result = new List<HtmlElement>(); 
    bool last = singleSelectors.Length == 1; 
    string singleSelector = singleSelectors[0]; 
    if (string.IsNullOrWhiteSpace(singleSelector) || string.IsNullOrWhiteSpace(singleSelector.Trim())) 
    { 
     return null; 
    } 
    singleSelector = singleSelector.Trim(); 
    if (singleSelector.StartsWith("#")) 
    { 
     var item = document.GetElementById(singleSelector.Substring(1)); 
     if (item == null) 
     { 
      return null; 
     } 
     if (last) 
     { 
      result.Add(item); 
     } 
     else 
     { 
      var results = GetElementsByParent(document, item, singleSelectors.Skip(1).ToArray()); 
      if (results != null && results.Length > 0) 
      { 
       foreach (var res in results) 
       { 
        result.Add(res); 
       } 
      } 
     } 
    } 
    else if (singleSelector.StartsWith(".")) 
    { 
     if (baseElement == null) 
     { 
      baseElement = document.Body; 
     } 
     foreach (HtmlElement child in baseElement.Children) 
     { 
      string cls; 
      if (!string.IsNullOrWhiteSpace((cls = child.GetAttribute("class")))) 
      { 
       if (cls.Split(' ').Contains(singleSelector.Substring(1))) 
       { 
        if (last) 
        { 
         result.Add(child); 
        } 
        else 
        { 
         var results = GetElementsByParent(document, child, singleSelectors.Skip(1).ToArray()); 
         if (results != null && results.Length > 0) 
         { 
          foreach (var res in results) 
          { 
           result.Add(res); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    else 
    { 
     HtmlElementCollection elements = null; 

     if (baseElement != null) 
     { 
      elements = baseElement.GetElementsByTagName(singleSelector); 
     } 
     else 
     { 
      elements = document.GetElementsByTagName(singleSelector); 
     } 
     foreach (HtmlElement item in elements) 
     { 
      if (last) 
      { 
       result.Add(item); 
      } 
      else 
      { 
       var results = GetElementsByParent(document, item, singleSelectors.Skip(1).ToArray()); 
       if (results != null && results.Length > 0) 
       { 
        foreach (var res in results) 
        { 
         result.Add(res); 
        } 
       } 
      } 
     } 
    } 
    return result.ToArray(); 
} 

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    // here we can query 
    var result = GetElementsByParent(webBrowser1.Document, null, "#theseImages", "img"); 
} 

結果,那麼可能會包含在#theseImages

心靈你GetElementsByParent是圖像相當未經測試,我只是測試它的用例,它似乎是好的。

不要忘記,一旦你確認文檔完成只是開始查詢;)

+0

感謝您的支持! – hanahouhanah

+0

歡迎您和@hanahouhanah如果它回答您的問題,然後隨意標記它以及:) – Icepickle