2010-10-18 14 views
10

Bir web sitesinden bazı bilgileri aldatmaya çalışıyorum ama benim için çalışan bir çözüm bulamıyorum. İnternette okuduğum her kod benim için en az bir hata oluşturur.Html Agility Pack yardım

Ana sayfadaki örnek kod bile benim için hatalar üretir.

'HtmlDocument 'System.Windows.Forms.HtmlDocument' ve 'HtmlAgilityPack.HtmlDocument' C arasında belirsiz bir referans:

  HtmlDocument doc = new HtmlDocument(); 
     doc.Load("https://www.flashback.org/u479804"); 
     foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) 
     { 
      HtmlAttribute att = link["href"]; 
      att.Value = FixLink(att); 
     } 
     doc.Save("file.htm"); 

aşağıdaki hata üretir:

Benim kod

* \

Düzenleme Form1.cs: My bütün kod burada yer alır: http://beta.yapaste.com/55

Tüm yardımlar çok takdir ediliyor!

+0

Cevabımda bahsettiğim gibi, gerçekten ne yapmaya çalıştığınızı söyleyemem. Daha ayrıntılı bir şekilde elde etmeye çalıştığınız görevi tanımlayabiliyorsanız, bunu başarmak için örnek bir uygulama yazmanıza yardımcı olmaya çalışacağım. – rtpHarry

+0

Derleyiciyi kapatmak için "HtmlDocument" yerine "HtmlAgilityPack.HtmlDocument" kullanabileceğinizi düşünüyorum. –

+0

Ah, "HtmlDocument = System.Windows.Forms.HtmlDocument kullanarak;" Bir şekilde "büyülü", HtmlDocument sınıfının HtmlAgilityPack sürümünü geçersiz kılan benim kullanım cümlemize eklendi. –

cevap

9

Kullanım HtmlAgilityPack.HtmlDocument:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

derleyici using ile ithal gelmiş ad iki HtmlDocument denilen sınıfları içerdiğinden karıştı oluyor - HTML çeviklik paketi ad ve Windows ad Forms. Açıkça kullanmak istediğiniz sınıfı belirterek bunu aşabilirsiniz.

+0

O zaman başka bir hata alıyorum: 'HtmlAgilityPack.HtmlDocument', 'DocumentElement' için bir tanım içermiyor ve 'HtmlAgilityPack.HtmlDocument' türünde bir ilk argümanı kabul eden 'DocumentElement' uzantısı bulunamıyor (kullanma yönergesi eksik mi veya bir montaj başvurusu?) –

+0

@Victor: Kitaplığın tam düzeninden emin değilim, ancak http://htmlagilitypack.codeplex.com/wikipage?title=Examples&referringTitle=Home örnek kodunu görüyorum. Bu sayfanın en altındaki yorumdan, "DocumentElement" yerine "DocumentNode" seçeneğini denemek isteyebilirsiniz. Bu biraz uzun bir çekim olsa da ... –

+0

DocumentNode bana daha fazla hata veriyor DocumentElement –

2

İki ad alanındaki System.Windows.Forms ve HtmlAgilityPack sınıfları çelişkilidir. Tam nitelikli tür isimleri kullanın veya ad alanı takma adlarını kullanın.

+0

Bu bana fazla yardımcı olmadı, biraz daha ne yapmalıyım? –

1

HtmlAgilityPack'in nasıl kullanılacağını açıklayan birkaç makale yazdım. Başlamak için onları yarayabilecek:

UYARI (2012-06-08): Bu bağlantı biraz spam olduğunu - tehlikeli pop-under reklamlar, pek içeriği.

Şimdi düzeltip düzeltmediklerini bilmiyorum, ancak bu pasaj, sitenin ana sayfasında çalışmadı, sanırım kütüphanenin önceki bir sürümünden geliyordu. Ayrıca snippet, FixLink() öğesini tanımlamaz; bu nedenle kitaplık için doğru olsa bile çalışmaz.

Kitaplığın en yeni beta sürümünü almanızı öneririm çünkü daha sonradan karışık xpath sorgularından kurtaracak linq sorguları gerçekleştirmek için ek uzantıları vardır.

Ben bir Windows'ta kullanılan görmedim

önce Forms uygulaması ancak böyle tam olarak nitelenmiş tipi adlarını kullanmak zorunda kalacak gibi görünüyor: gerçekleştirmeye çalışıyoruz fiili görev gelince

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

, bir url almak, bir kullanıcı adı ve id onu enjekte etmek istediğiniz gibi görünüyor ve sonra ... emin değil misiniz? İkisi de dosyayı diske kaydetmeye çalışıyor ve html kodunu yapabileceğiniz bir formun içeriğine ayarlamaya çalışıyorsunuz gibi mi görünüyorsunuz?

+0

@tomfanning - bildirim için teşekkürler, widget'lardan birinin spam kullanıcıları olduğu görülüyor. PostRank ve Blogged.com widget'larını kaldırdım ve artık spam pop'u göremiyorum. – rtpHarry

5

Bu şekilde başardım. Foreach line belgesinde ana Html Agility Pack Example belgesinde verilen bir kod hatası olduğunu unutmayın.DocumentElement.SelectNodes ("// a [@href"]). Doğru ve test edilmiş olan aşağıda verilmiştir.

HtmlWeb hw = new HtmlWeb(); 

    HtmlDocument doc = hw.Load(@"http://tipscow.com"); 
    StringBuilder sb = new StringBuilder(); 

    List<string> lstHref = new List<string>(); 

    foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]").Distinct()) 
    { 
     string curHref = link.Attributes["href"].Value; 

     if(!lstHref.Contains(curHref)) 
     lstHref.Add(curHref); 

    } 
    foreach (string str in lstHref) 
    { 
     sb.Append(str +"<br />"); 
    } 

    Response.Write (sb.ToString()); 

Benim için çalıştığından beri, paylaşmam gerektiğini düşündüm.