Avatar billede justincase1089 Nybegynder
19. juli 2006 - 13:42 Der er 14 kommentarer og
1 løsning

Parse html

Hej

Jeg søger en måde at parse indholdet af siden

http://www.google.com/maps/api_signup?url=http%3A%2F%2Flocalhost:4568/MySite

Når jeg henter siden ind i en HtmlRequest og går den vej igennem kan jeg ikke få´fat på koden der fremgår lige efter "Your Code Is". Npr jeg navigerer til siden med en WebBrowser kan jeg godt få fat på siden, men det duer ikke at bruge en WebBrowser, da jeg skal køre med det her i en web applikation og WebBrowseren ikke er flertrådet. Derfor skal det være ved brug af noget i retningen af:

request = (HttpWebRequest)WebRequest.Create(url);
response = (HttpWebResponse)request .GetResponse();
stream = response .GetResponseStream();

På forhånd tak.

MVH
  Justin Case
Avatar billede mcgoat Nybegynder
19. juli 2006 - 19:26 #1
http://www.eksperten.dk/spm/720149

there you go.

regner med det var det du skulle bruge :)
Avatar billede justincase1089 Nybegynder
20. juli 2006 - 07:51 #2
Ja, men det er jo netop det jeg siger ikke virker .. prøv selv med den URL jeg har givet
Avatar billede lateralus Nybegynder
20. juli 2006 - 08:27 #3
Når jeg kalder ovenstående side i min browser får jeg 302 og bliver redirected til en "Google accounts" side, hvor man kan registere sig. Mon ikke det er denne registereringsside du også får fat i dit program? Det er muligt, at din browser sender en cookie af en eller anden form med, som gør at den får adgang. I så fald skal du så også sørge for at sende denne cookie med, når du requester siden fra dit program.
Avatar billede justincase1089 Nybegynder
20. juli 2006 - 08:39 #4
Ja, det kunne jeg forestille mig. Kan det have noget at gøre med at httprequest ikke ligner en browser når den laver forespørgslen?
Avatar billede lateralus Nybegynder
20. juli 2006 - 11:43 #5
Ikke ligner en browser? Det eneste måde hvorpå webserveren kan se hvilken type agent der er tale om er via "user-agent" HTTP headeren. Du kan evt. sætte denne til at matche Internet Explorers ("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" på min maskine). Men jeg tvivler nu på at det er derfor du får et andet respons end via browseren. Hvad sker der hvis du sletter alle dine cookies i browseren og kalder siden igen?
Avatar billede segato Nybegynder
20. juli 2006 - 12:27 #6
Du kan jo køre browser synkront:

Browser.Navigate("www.dfdfd.dk");

while( Browser.ReadyState != ReadyState.Completed )
  Application.DoEvents();

Hvorfor du kan få fa i koden med webbrowser og ikke med HttpWebRequest skyldes formentlig redirects eller javascripts som HttpWebRequest ikke fanger.

I stedet for at anvende browser vil jeg dog anbefale dig at kigge på CreateDocumentFromUrl, ingen grund til at have en webbrowser i sin kode med mindre du skal vise noget:

using System;
using System.Xml;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using mshtml;

namespace Common.Libraries.Html
{
    public class HTMLDocumentUtil
    {
      public  XmlDocument GetXmlDocument(string html)
        {
            return null;
        }

        public mshtml.IHTMLDocument2 LoadHtmlDocument(string html)
        {
            mshtml.IHTMLDocument2 doc = new mshtml.HTMLDocumentClass();

            html = html.Replace("window.", "window..");
            html = html.Replace("document.", "document..");
            html = html.Replace(".submit()", "submit().");
            html = html.Replace(".open", "..open");
            html = html.Replace(".show", "..show");
            html = html.Replace(".location", "..location");

            int i = html.ToLower().IndexOf("<head>");

            if (i != -1)
                html = html.Insert(i + 6, "<script type=text/javascript>function handleError() {return true;}window.onerror = handleError;</script>");

            doc.write(new object[] { html });

            while (doc.readyState != "complete")
                System.Windows.Forms.Application.DoEvents();

            return doc;
        }

        public mshtml.IHTMLDocument2 CreateHtmlDocument(string url)
        {
            mshtml.HTMLDocument objMSHTML = new mshtml.HTMLDocument();
           
            mshtml.IHTMLDocument2 objDocument;
            IPersistStreamInit ips;
            ips = ((IPersistStreamInit)objMSHTML);
            ips.InitNew();
            objDocument = objMSHTML.createDocumentFromUrl(url, null);

            if (objDocument == null)
                return null;

            while (objDocument.readyState != "complete")
            {
                System.Windows.Forms.Application.DoEvents();
            }       
            return objDocument;
        }

        public IHTMLElement GetElementFromPath(IHTMLDocument2 doc, string path)
        {
            IHTMLElementCollection hec = (IHTMLElementCollection)doc.body.children;
            IHTMLElement hElement = null;
            FindElement(path, hec, hElement);

            return hElement;
        }
       
        void FindElement(string path, mshtml.IHTMLElementCollection hec, IHTMLElement element)
        {
            string tagName = getTagFromPath(path);
            int nr = getTagNumberFromPath(path);
            int counter = 0;

            foreach (IHTMLElement he in hec)
            {
                if (counter == nr && he.tagName == tagName)
                {
                    string s = trimPath(path);
                    if (s.Length > 1)
                    {
                        FindElement(s, (mshtml.IHTMLElementCollection)he.children, element);
                        break;
                    }
                    else
                    {
                        element = he;
                        return;
                    }
                }
                else
                {
                    if (he.tagName == tagName)
                    {
                        counter++;
                    }
                }
            }
        }

        string trimPath(String path)
        {
            string p = path.Substring(path.IndexOf('.') + 1, path.Length - path.IndexOf('.') - 1);
            return p;
        }

        string getTagFromPath(string path)
        {
            return path.Substring(0, path.IndexOf('['));
        }

        int getTagNumberFromPath(string path)
        {
            string nr = System.Text.RegularExpressions.Regex.Match(path, @"^(\w+)\[(\d+)\]").Groups[2].Value;
            string s1 = System.Text.RegularExpressions.Regex.Match(path, @"^(\w+)\[(\d+)\]").Groups[1].Value;
            return Int32.Parse(nr);
        }
    }

    [ComVisible(true), ComImport(), Guid("7FD52380-4E07-101B-AE2D-08002B2EC713"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPersistStreamInit
    {
        void GetClassID(ref Guid pClassID);
        [PreserveSig()]
        int IsDirty();
        [PreserveSig()]
        int Load(UCOMIStream pstm);
        [PreserveSig()]
        int Save(UCOMIStream pstm, bool ByValfClearDirty);
        [PreserveSig()]
        int GetSizeMax([InAttribute(), Out(), MarshalAs(UnmanagedType.U8)] ref long pcbSize);
        [PreserveSig()]
        int InitNew();
    }
}

Husk at tilføje mshtml.dll til dine referencer.
Avatar billede segato Nybegynder
20. juli 2006 - 12:28 #7
Her har du en klasse der kan give dig et HtmlDocument.
Avatar billede justincase1089 Nybegynder
20. juli 2006 - 12:40 #8
Det har ganske rigtigt noget med en cookie at gøre
Avatar billede segato Nybegynder
20. juli 2006 - 12:50 #9
Du kan sagtens tilføje cookies til HttpWebRequest.
Avatar billede segato Nybegynder
20. juli 2006 - 18:50 #10
Fik du løst problemmet?
Avatar billede justincase1089 Nybegynder
21. juli 2006 - 08:00 #11
lateralus og segato, smid et svar
Avatar billede segato Nybegynder
21. juli 2006 - 14:45 #12
svar :D Fik du hul på problemmet?
Avatar billede justincase1089 Nybegynder
23. juli 2006 - 21:26 #13
Jeg har ikek fået løst problemet helt endnu, men er overbevist om at det kan lykkes. Det var det med cookien jeg manglede. Har dog ikke fundet ud af, hvordan jeg loader en cookie på harddisken ind og kobler den på en htmlrequest, men det kan jeg nok finde eksempler på på nettet
Avatar billede segato Nybegynder
24. juli 2006 - 13:44 #14
HttpWebRequest har en CoocieCollection. hvis du sæter dne til new CoocieCollection sørger selv for det hele. Har noget kode du kan få hvis du er interessret. Btw kom til at smide en kommentar kan jeg se.
Avatar billede justincase1089 Nybegynder
17. april 2007 - 12:44 #15
Tak, det lykkedes
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester