Wyrażenia regularne

0

Witam wszystkich. Nie daje rady już z tym formatowaniem regexów i dlatego proszę Was o pomoc :(

A mianowicie: html wygląda tak:

 <div class="content">
                                        <div class="address">
                                        <h3>Józefa Grabowska</h3>
                                        <div class="adr">
                                        Pl. Jana Pawła II 150<br/>15-090 Białystok                                        </div>
                                    </div> 

Z imieniem sobie poradziłem. Ale jak wyciągnąć adres? :(

".adr.\b[^>]*\>*([\s\S]*?)\</br\>"

Wiem, że to może być w ogóle NIC NIE WARTA składnia, ale chce pokazać, że próbuję :/

A imię wytargałem tak (składnia z internetu, trochę zmodyfikowana. Dlatego też jeszcze jedno pytanie: po co jest to groups pod koniec?):

string imie_nazwisko = Regex.Match(content, @"\<h3\b[^>]*\>\s*(?<h3>[\s\S]*?)\</h3\>", RegexOptions.IgnoreCase).Groups["h3"].Value;
 

PS: chyba, że ma ktoś pomysł jak wyciągnąć dane ze strony inaczej niż analiza stringu? A może da się jakoś po ID czy value obiektu html?

2

Użyj HtmlAgilityPack, nie będziesz się musiał bawić w regexy.

0

Wiele to nie dało. Ciężko to ogarnąć, bo dziwnie to parsuje. To obcina elementy tak, że nie mogę się nawet doszukać żadnych tagów. Albo to ja coś robię źle. Chyba jednak pozostane przy regexach i coś wymyślę.

0

A to daje użycie wspomnianej biblioteki:

 +		Wyjątek	Zgłoszony wyjątek: „System.NullReferenceException” w WindowsFormsApplication1.exe („Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.”)	System.NullReferenceException
 
1

Najpopularniejszy wyjątek na świecie, próbujesz się dostać do czegoś co jest nullem.

0

Rozumiem komunikat :P Ale rozumiem też już mój błąd - counter w pętli z tablicą. Racja, głupi błąd.
Ale szczerze mówiąc porzuciłem idee z rozwiązaniem Twoim, za które i tak serdeczne podziękowania ślę pod Twój adres, a zostaję przy regexie. A raczej próbach z nim związanych, dlatego na koniec dodam:

Wątek wciąż aktualny :/

3

Coś się tak na ten regex uparł, HtmlAgilityPack do tego właśnie służy.

            HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
            document.Load("test.html");
            var addresses = document.DocumentNode.Descendants("div")
                .Where(d => d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("address"));
            foreach (var adr in addresses)
            {
                var name = adr.Descendants("h3").First().InnerText;
                var innerAdress = adr.Descendants("div").Where(d => d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("adr")).First().InnerText;
                Console.WriteLine("Imię i nazwisko: {0}, adres: {1}", name, innerAdress);
            }
1

To może tak na początek: http://stackoverflow.com/a/1732454/4236533

0

Hmmm... Nie wciągałem się w tą bibliotekę gdyż cały mój program opiera się na regexach właśnie, ale w dużo prostszej formie, tj. tagi wyciągane w formie typowo <x> </x>. Programistą jestem poziomu technikum IT, więc można powiedzieć, że nawet nie początkującym a żadnym. Ale staram się rozwijać jak tylko mogę, bo bardzo mi się podoba to co robię, a w zasadzie - robimy.

Aczkolwiek wracając do tematu: dzięki za gotowe rozwiązanie, będzie ono dla mnie wzorem do analizy i coś czuje patrząc na nie, że wzorem również do dokończenia mojego programu.

A skoro już mogę zapytać Programistów z prawdziwego zdarzenia - to dwa pytania. Jeśli w tekście którego szukam regexem, chce coś wyświetlić i pojawia się tam znak "" - przykład jest na początku, gdzie chciałem zastosować składnię "<div class="adr"\b[^>]*\>*([\s\S]*?)\</br\>" co skutkowało tym, że znaki ADR nie były brane pod uwagę bo "" przed i po uważane były jako koniec poprzedniego " i początek następnego ". Czy ten problem obchodzi się jak w VB znakami ' ' ? Nie pamiętam o co chodziło dokładnie, ale czy ide dobrym tropem? Sprawdziłbym to sam gdyby nie fakt, że na tym PC nie mam kompilatora.

A pytanie numer dwa: czy jest jakaś możliwość, nie pytam tu o gotowca. Broń Boże! A tylko czy w języku C# albo nawet w którymkolwiek - czy jest możliwość np. rejestracji na stronie www ale przez pola wpisane w programie? A nie na stronie? Wiem, że WebBrowser byłby ok. Ale chciałbym zrobić wszystko hmm.. Po cichu. Tj ktoś podaje dane w textboxy np., ja pokazuje mu tylko captche (i kolejny problem - da się pobierać i wyświetlać elementy www ale tylko wybrane, np. ID albo klase? I to tak na żywo?) a dane z pól lecą do formularza na stronie?

Wiem, że dużo pytam. Ale taki już jestem :/ Myślę, że to nie będzie problemem dla czytających. Pozdrawiam i dziękuję ogromnie za pomoc dotychczasową.

  • Krzysiek

PS:

dam1an napisał(a):
HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
document.Load("E://text.txt");

Coś mi to łapać nie chciało i choć nie wiem czy składnia poprawna, to zmieniłem na:

string Url = "http://stronadomowa.com";
             HtmlWeb web = new HtmlWeb();
             HtmlAgilityPack.HtmlDocument document = web.Load(Url);

I ruszyło. Więc dzięki raz jeszcze za pomoc :)

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