Avatar billede webmover Nybegynder
21. oktober 2010 - 10:16 Der er 17 kommentarer og
1 løsning

Problem med IHTMLElementCollection

Hej Eksperter,

jeg har denne kode som jeg ikke kan få til at virke!

code:

HTMLDocument CrawlHTML = CrawlWebPage();
     
        IHTMLElementCollection htmlCollection = CrawlHTML.getElementsByTagName("h1");

        for (int i = 0; i < htmlCollection.length; i++) {

            HtmlElement TheElement = htmlCollection.item[i];

            showInner.Text = TheElement.InnerHtml;
       
        }

Problemmet skyldes denne linje:

HtmlElement TheElement = htmlCollection.item[i];

jeg får denne fejl :
Cannot apply indexing with [] to an expression of type 'method group'

så hvordan får jeg så fat i de enkelte elementer
Avatar billede bkp Nybegynder
21. oktober 2010 - 10:30 #1
Hvad med at forenkle din loop på følgende måde, sig til om det virker:

foreach (var item in CrawlWebPage().getElementsByTagName("h1");)
{
    showInner.Text = item.InnerHtml;
}

Spændt på at høre om det virker ;-)
Avatar billede webmover Nybegynder
21. oktober 2010 - 13:31 #2
Tak for det :) Der er dog to ting.

1. jeg har desværre ikke kunne teste det da jeg nu får en fejl i min CrawlWebPage funktion

den ser sådan her ud :

public static HTMLDocument CrawlWebPage(string url)
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.UserAgent = "spikkeCrawler";

        WebResponse response = request.GetResponse();

        Stream stream = response.GetResponseStream();

        StreamReader reader = new StreamReader(stream);

        WebBrowser MyBrowser = default(WebBrowser);

        MyBrowser.DocumentText = reader.ReadToEnd();

        mshtml.HTMLDocument htmlText = (mshtml.HTMLDocument)MyBrowser.Document.DomDocument;
                   
        return htmlText;
    }

men jeg får en

System.NullReferenceException: Object reference not set to an instance of an object.

i denne linje :
MyBrowser.DocumentText = reader.ReadToEnd();

så den kommer aldrig til den kode du posted.

2. Så kan jeg se at denne linje i den kode du sende vil fejle

showInner.Text = item.InnerHtml;

for inem.InnerHtml kaldet findes ikke.
Avatar billede bkp Nybegynder
21. oktober 2010 - 13:38 #3
Så må du tjekke om reader er null:

if (reader != null) MyBrowser.DocumentText = reader.ReadToEnd();
Avatar billede webmover Nybegynder
21. oktober 2010 - 13:40 #4
reader er ikke null?
Avatar billede webmover Nybegynder
21. oktober 2010 - 13:40 #5
det er det der er det underlige
Avatar billede bkp Nybegynder
21. oktober 2010 - 13:48 #6
Et eller andet er null, prøv sætte et breakpoint på linien og debugge dig igennem og hold musen hen over reader og MyBrowser og tjek deres tilstand, det må være en af disse objekter der er null ellers giver din fejlbesked ikke mening.
Avatar billede webmover Nybegynder
21. oktober 2010 - 13:58 #7
Når jeg debugger er det MyBrowser som den angiver som problemet og at det er den der er null ??
Avatar billede bkp Nybegynder
21. oktober 2010 - 14:09 #8
Jeg har tidligere lavet et program der henter html fra en url, måske kan du bruge min funktion, den ser således ud:

        public string LoadPageHtml(string url)
        {
            var result = "";
            try
            {
                var myRequest = (HttpWebRequest)WebRequest.Create(url);
                myRequest.Method = "GET";
                var header = myRequest.Headers;
                var myResponse = myRequest.GetResponse();
                var streamReader = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
                result = streamReader.ReadToEnd();
                streamReader.Close();
                myResponse.Close();               
            }
            catch (Exception err)
            {
                throw;
            }
            return result;
        }
Avatar billede bkp Nybegynder
21. oktober 2010 - 14:11 #9
Husk at lave reference til System.Net og System.IO
Avatar billede bkp Nybegynder
21. oktober 2010 - 14:25 #10
Måske kunne du bruge følgende sammen med ovenstående LoadPageHtml.
Fra webControl kan du så trække HTMLDocument, var det en ide?

WebBrowser webControl = new WebBrowser();
webControl.DocumentText = LoadPageHtml(url);
do
{
    Application.DoEvents();
} while (webControl.ReadyState != WebBrowserReadyState.Complete);
Avatar billede webmover Nybegynder
21. oktober 2010 - 14:50 #11
Det har jeg desværre prøver, der er intet problem men at hente indholdet fra sitet og hvis jeg putter det ned i en string kan jeg udskrivede uden problemer. Problemet er "webControl.DocumentText" fejler
Avatar billede bkp Nybegynder
21. oktober 2010 - 15:28 #12
Hvis jeg lige får tid, vil jeg gerne kigge nærmere på det, men når det ikke mere lige nu.
Avatar billede webmover Nybegynder
21. oktober 2010 - 15:38 #13
Ok super tak!
Avatar billede bkp Nybegynder
21. oktober 2010 - 16:23 #14
Så har jeg kigget lidt nærmere på det, og måske dette vil virke for dig.

Først skal du lige hente denne assembly og knytte en reference til dennes dll.
http://htmlagilitypack.codeplex.com/

Jeg forudsætter du har din rene html i denne variabel:

string html = ....;

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
HtmlNode htmlNode = doc.GetElementbyId("h1");

Håber det virker for dig.
Avatar billede bkp Nybegynder
21. oktober 2010 - 16:29 #15
Se desuden andet eksempel her:

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


http://htmlagilitypack.codeplex.com/wikipage?title=Examples&referringTitle=Home
Avatar billede webmover Nybegynder
25. oktober 2010 - 20:40 #16
Tak for hjælpen!
Avatar billede bkp Nybegynder
25. oktober 2010 - 20:52 #17
Det var så lidt ;)
Avatar billede webmover Nybegynder
03. november 2010 - 11:27 #18
lukker :)
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