Pobranie wybranych danych z www i/lub skalowanie WebBrowser

0

Dzień dobry,
chcę napisać dla siebie program, który wyświetli mi w obrębie okna aplikacji wybrane dane z kilku podanych stron. Jak ja to widzę: wstawiam tyle WebBrowserów ile różnych stron chcę "monitorować". Definiuję dla każdego, co ma wyświetlać i tak np. dla 4programmers niech to będzie żółta kolumna "Jak formatować treść postu" - tylko to, nic więcej. Jak się za to zabrać? Może jakieś podanie w programie pikseli od-do których ma wyświetlać?

Zdecydowanie nie chcę taplać się w parsowanie kodu.

Pozdrawiam

0

mysle ze podejscie ktore proponujesz sprawi ze zmarnujesz mase czasu i malo prawdopodobne, aby dzialalo to tak jak sobie wyobrazasz. jesli chcesz pokazywac jakies dane to powinienes znalezc sposob, aby je dostac w 'surowej' formie a nastepnie wyswietlac je uzywajac kontrolek do tego przystosowanych, bez polegania na kaprysach przegladarki i/lub autorow strony.

0

@katelx Właśnie chodzi o to, aby ktoś zasugerował w jaki sposób to zrobić.

0

napisalam ci

0

Wiem tyle samo, co przed założeniem tutejszego tematu.

0

Mniej więcej coś takiego:

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Visible = false;
            webBrowser1.Navigate("http://4programmers.net/Forum/C_i_.NET?mode=submit");

        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            
            WebBrowser WB = ((WebBrowser)sender);
            if (WB.Document != null) 
            {
                //nie wiem dlaczego na tej stronie akurat diva help-sidebar od razu nie znajduje i szukam go troche "na piechotę" :/ 
                HtmlElement divHintSubject = WB.Document.GetElementById("hint-subject");
                if (divHintSubject != null)
                {
                    HtmlElement divHelpSidebarElem = divHintSubject.Parent;
                    if (divHelpSidebarElem != null)
                    {
                        divHelpSidebarElem.ScrollIntoView(true); //przewijamy do wyswetlanego elementu
                        //nadajemy WebBrowser rozmiary elementu który chcemy wyswietlic
                        WB.Width = divHelpSidebarElem.OffsetRectangle.Right - divHelpSidebarElem.OffsetRectangle.Left;
                        WB.Height = divHelpSidebarElem.OffsetRectangle.Bottom - divHelpSidebarElem.OffsetRectangle.Top;
                        WB.ScrollBarsEnabled = false; //ukrywamy paski przewijania
                        WB.Visible = true; //teraz mozna pokazac WB
                    }
                }
            }
        }
0

Dziękuję, działa.

A jeśli div leci po klasie, a nie ID - domyślam się, że trzeba użyć WB.Document.GetElementsByTagName, bo jeśli jest "<div class"test">, to zwyczajnie nie działa. Ale wtedy cała reszta sypię się ze względu na różnice pomiędzy HtmlElement a HtmlElementCollection.

Może jest jakaś konwersja w stylu "Convert.To*".

0

A tu nie chodzi o to, ze ta różnica pomiedzy HtmlElement i HtmlElementCollection wynika stad, ze ten pierwszy to jeden element, a ten drugi to kolekcja tych pierwszych? I ze wystarczy z tej kolekcji wyciagnac ktorys element (wg jakiegos kryterium)?

0

Jeżeli chcesz szukać po klasie to TORETYCZNIE można sobie napisać prostą funkcję np:

        private HtmlElement GetElementByClassName(WebBrowser webBrowser, string className, string tagName = "")
        {
            if (webBrowser.Document != null)
            {
                HtmlElementCollection elementCollection;
                if (tagName.Length > 0) {
                    elementCollection = webBrowser1.Document.GetElementsByTagName(tagName); 
                }
                else
                {
                    elementCollection = webBrowser1.Document.All;
                }

                foreach (HtmlElement elem in elementCollection)
                {
                    if (String.Equals(elem.GetAttribute("className"), className, StringComparison.OrdinalIgnoreCase))
                    {
                        return elem;
                    }
                }
            }
            return null;
        }

Ale jest jedna uwaga która wyklucza jej wykorzystanie otóż HTML pozwala na to aby wiele elementów miało tą samą nazwę klasy (w przeciwieństwie do ID) a funkcja ta zwracała by zawsze pierwszy znaleziony. Tu trzeba raczej nie piechotę po czymś innym rozpoznawać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1