2013-04-05 4 views
5

Bu, HAP kullanarak öğe değeri elde etme ilk denememdir. InnerText'i kullanmaya çalıştığımda boş nesne hatası alıyorum.HTML Çeviklik Paketi - tek bir düğüm almak için XPath kullanarak - Nesne Başvurusu bir nesnenin örneğine ayarlanmadı

ben kazıma am URL: - http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013 Ben Günü değiştir Özet Tablo yüksek akım değerini almak çalışıyorum.

Kodum altta. Öncelikle, bu konuda doğru yoldan gidip gitmeyeceğimi bilmek isterim? Eğer öyleyse, o zaman sadece benim XPath değerin yanlış mı?

XPath değeri, htmlagility helper adlı bir yardımcı program kullanılarak elde edildi. Aşağıdaki XPath’ın firebug versiyonu da aynı hatayı verir: - /html/body/div [3]/div/table/tbody/tr [3]/td/table/tbody/tr [5]/td [ 3]

Kodum: -

WebClient myPivotsWC = new WebClient(); 
string nodeValue; 
string htmlCode = myPivotsWC.DownloadString("http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013"); 
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(htmlCode); 
HtmlNode node = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[3]/div[1]/table[1]/tbody[1]/tr[3]/td[1]/table[1]/tbody[1]/tr[5]/td[3]"); 
nodeValue=(node.InnerText); 

sayesinde Will.

cevap

22

FireBug veya Chrome gibi geliştirici araçlara güvenemezsiniz. Bu durumda, XPATH tarafından verilen düğümler için verilen XPATH, bu araçlar tarafından verilen bellekte HTML DOM'a karşılık gelir. Html Çeviklik Paketi sadece sunucu tarafından gönderilen ham HTML hakkında bilgi sahibi olur.

Yapmanız gereken şey, geri gönderilene görsel olarak bakmaktır (ya da yalnızca bir görüntüleme kaynağı). Örneğin, TBODY öğesi olmadığını göreceksiniz. Yani, diskriminant herhangi bir şey bulmak ve örneğin XPATH axes kullanın. Ayrıca, XPATH'niz çalışsa bile belgede yapılan değişikliklere karşı çok dirençli olmayacaktır, bu yüzden kazıma işleminin daha geleceğe dönük olması için daha kararlı bir şey bulmanız gerekir.

  • 'dnTableCell' olarak ayarlanmış bir SINIF niteliğine sahip bir TD elemanı bulmak:

    HtmlNode node = doc.DocumentNode.SelectSingleNode("//td[@class='dnTableCell']//a[text()='High']/../../td[3]"); 
    

    Bu yaptığı şudur: Burada

    iş gibi görünüyor bir koddur. // jetonu, aramanın XML hiyerarşisinde tekrarlayıcı olduğu anlamına gelir.
  • Bir metin (iç metin) 'Yüksek' olarak eşit olan bir A öğesi bulun.
  • navigasyon iki ebeveyn kadar
  • explaind Simon Mourier'in gibi orada
+0

Teşekkür yığınlar, onlar olur. XPath hakkındaki açıklamanızı araştıracağım, bunu XPath kullanmayı öğrenmeden bitirmeyi başarabileceğimi düşündüm, ama açıkça yapmam gerekecek. – dontpanic

+0

@dontpanic: "xpath" öğelerini öğrenin, xpath sorgunuzu hassaslaştırmak için sorular sorun, çok fazla "xpath" Q & A ile ilgili sorularınız var. – MattH

+0

@Simon: Ben de benzer bir sorun yaşıyorum ve önerinizi takip etmeye çalıştım ve hala şanssız kaldım. Http://weather.deltixlab.com/ 'daki aşağıdaki tablodan herhangi bir değerden örnek gösterebilmeniz mümkün: Yazım dize day1 = doc.DocumentNode.SelectNodes ("// * [@ class = 'table-block'] /../../../ tr [1]/td [1] ") [0] .InnerText;' – goodfella

2

den 3 TD elemanı seçmek (biz en yakın TR elemana alırsınız), sunucu tarafından gönderilen ham HTML elde . İhtiyaç duyduğunuz eleman henüz oluşturulmamış, ancak DOM'da bulunmadığı için bunu geri alamazsınız. Bu soruna dair basit bir çalışma, DOM'u oluşturmak için bir web oluşturucuyu kullanmaktır; HTML'yi yakalayabilir ve kazıyabilirsiniz. Böyle WatiN kullanın:

WatiN.Core.Settings.MakeNewInstanceVisible = false; 
WatiN.Core.Settings.AutoMoveMousePointerToTopLeft = false; 
IE ie = new IE(); 
ie.GoTo(urlLink); 
ie.WaitForComplete(); 
string html = ie.Html; 
ie.close(); 
+0

Teşekkür ederim, temelde eksik DOM almak için sayfayı tamamen render gerekir. Şimdi beni endişelendiren, bunun sebep olacağı gecikme. – goodfella