2009-10-10 9 views
1

Je prévois de développer un robot d'indexation Web, qui extrairait les coordonnées des éléments html des pages Web. J'ai découvert qu'il est possible d'obtenir des coordonnées d'éléments html en utilisant l'assemblage "mshtml". En ce moment Je voudrais savoir si c'est possible et comment obtenir seulement les informations nécessaires (html, css) à partir de la page web, puis en utilisant les classes mshtml appropriées obtenir correct coordonnées de tous les éléments html?Comment obtenir les coordonnées d'un élément HTML en utilisant C#?

Merci beaucoup!

+0

Voulez-vous dire que les coordonnées en pixels de bords supérieur et gauche de la fenêtre du navigateur? Comme cela se traduit un peu différemment dans les différents navigateurs, je doute que ce soit même possible. (Et aussi, il semblerait plus ou moins impossible de définir quelles coordonnées sont "correctes", aussi ...) –

+0

Il peut rendre légèrement differnet, mais un seul moyen est correct (en supposant que vous avez un fichier CSS qui élimine les valeurs par défaut du navigateur .) – erikkallen

+0

Les coordonnées, en pixels, peuvent être identiques par rapport au nœud parent. Ce que je voulais dire à propos des coordonnées correctes, c'est que le fichier html rendu sans fichier css donnerait différentes coordonnées d'éléments. Ce que je ne sais pas s'il est possible d'utiliser la classe HTMLDocument pour analyser une page web sans avoir à la télécharger manuellement, et de le faire le plus efficacement possible. – spacemonkey

Répondre

2

Vous devez transmettre une référence à l'élément HTML en question.

public static int findPosX(mshtml.IHTMLElement obj) 
{ 
    int curleft = 0; 
    if (obj.offsetParent != null) 
    { 
    while (obj.offsetParent != null) 
    { 
     curleft += obj.offsetLeft; 
     obj = obj.offsetParent; 
    } 
    } 

    return curleft; 
} 

public static int findPosY(mshtml.IHTMLElement obj) 
{ 
    int curtop = 0; 
    if (obj.offsetParent != null) 
    { 
    while (obj.offsetParent != null) 
    { 
     curtop += obj.offsetTop; 
     obj = obj.offsetParent; 
    } 
    } 

    return curtop; 
} 

Je reçois des éléments HTML du document en cours comme ceci:

// start an instance of IE 
public SHDocVw.InternetExplorerClass ie; 
ie = new SHDocVw.InternetExplorerClass(); 
ie.Visible = true; 

// Load a url 
Object Flags = null, TargetFrameName = null, PostData = null, Headers = null; 
ie.Navigate(url, ref Flags, ref TargetFrameName, ref PostData, ref Headers); 

while(ie.Busy) 
{ 
    Thread.Sleep(500); 
} 

// get an element from the loaded document 
mshtml.HTMLDocumentClass document = ((mshtml.HTMLDocumentClass)ie.Document); 
document.getElementById("myelementsid"); 
0

Je ne sais pas comment on pourrait faire cela en C# car ce n'est pas ma langue de choix mais cela pourrait être fait en utilisant Javascript, en particulier en utilisant offSet() function de jQuery. J'utilise ces fonctions C# pour déterminer les positions des éléments.

+0

Pourriez-vous expliquer un peu plus cette méthode, quelles sont les étapes à suivre pour obtenir l'information dont j'ai besoin? – spacemonkey

+0

C'est juste un cas d'appeler la fonction sur les éléments DOM pour lesquels vous voulez le décalage. Il y a quelques exemples dans ce lien. –

Questions connexes