Alternatywne wyłuskiwanie linków ze źródła html

0

Witam.

Czy jest możliwość aby za pomocą wyrażeń regularnych oprogramować jakoś taki problem :

Mamy kod strony źródłowy strony www a w nim linki - interesują mnie tylko konkretne wybrane z nich pozwalające przejść na adres z ogłoszeniem.

Przed adresami jest zawsze pewien stały tekst który wyróżnia te linki.

Przykładowy kod strony co mnie interesuje z pf.pl (przepraszam, że aż tyle)

wrocław</div><div class="clear"/><div class="results"> <div> <div rel="oemwkh_jzw" id="itemListing-1" class="listingItem searchItem searchItem-krak searchItem-silver"> <div class="fill"> <table class="table"> <tbody> <tr> <td class="logoArea" rowspan="3"> <a target="_blank" href="http://www.pf.pl/serwis/-C6812768B5827_INF.html" rel="nofollow" class="addax addax-cs_hl_hit_companylogotype_click"> <img border="0" title="Usługi Inżynierskie i Budowlane Wojciech Jakszycki Logo" alt="Usługi Inżynierskie i Budowlane Wojciech Jakszycki Logo" class="autoResize" src="http://panoramafirm.pl/images/8/4/004760084.gif"/> </a></td> <td class="nameArea" colspan="2"><h3><a class="js-offerName addax addax-cs_hl_hit_company_name_click" href="http://panoramafirm.pl/wrocław/uslugi_inzynierskie_i_budowlane_wojciech_jakszycki-oemwkh_jzw.html"> <span>A)</span> Usługi Inżynierskie i Budowlane Wojciech Jakszycki</a></h3></td> <td width="158" class="pictureArea" rowspan="3"> <div class="inside"><a rel="nofollow" target="_blank" href="http://www.pf.pl/serwis/-C6812768B5827_INF.html" class="addax addax-cs_hl_picture_click"> <img title="" alt="" src="http://panoramafirm.pl/images/6/4/004760164.jpg "/></a></div> </td> </tr> <tr> <td class="contactArea"><div class="inside"> <div class="addressArea"> <div class="left js-offerAddress">ul. Borelowskiego 20, Wrocław</div> <div class="clear"/> </div> <div class="phoneArea"> <span class="phone">tel. <a class="js-offerPhone" href="callto:+48604439218"> 604 439 218</a>, </span> fax <span class="fax">75 773 25 40</span> </div> <div class="emailArea"><a class="addax addax-cs_hl_email_submit_click" href="http://panoramafirm.pl/wyslij_wiadomosc/oemwkh_jzw.html">e-mail</a></div> </div></td> <td class="descriptionArea"> <div class="inside"> Usługi Inżynierskie i Budowlane Wojciech Jakszycki &#8211; to kompleksowa obsługa realizacji budowy (inwestycji) od projektu poprzez wykonawstwo do końcowych odbiorów. <a class="moreButton addax addax-cs_hl_hit_more_info_click" href="http://panoramafirm.pl/wrocław/uslugi_inzynierskie_i_budowlane_wojciech_jakszycki-oemwkh_jzw.html">Więcej</a> <div class="spacer"/> <div class="descriptionLinks"> <a href="http://panoramafirm.pl/dolnośląskie,śródmieście,wrocław,wrocław,borelowskiego/uslugi_inzynierskie_i_budowlane_wojciech_jakszycki-oemwkh_jzw.html"><div class="left bgIcons offerIcon addax addax-cs_hl_rfq_send_click"/></a> <a class="openHours addax addax-cs_hl_hit_opening_hours_click" href="http://panoramafirm.pl/wrocław/uslugi_inzynierskie_i_budowlane_wojciech_jakszycki-oemwkh_jzw.html">Godziny otwarcia</a> </div></div> </td> </tr> <tr> <td class="categoryArea" colspan="2"> Branże: <a class="addax addax-cs_hl_hit_category" href="http://panoramafirm.pl/wrocław/uslugi_inzynierskie_i_budowlane_wojciech_jakszycki-oemwkh_jzw.html">Budowlane inwestycje</a> &#8226; <a class="addax addax-cs_hl_hit_category" href="http://panoramafirm.pl/wrocław/uslugi_inzynierskie_i_budowlane_wojciech_jakszycki-oemwkh_mlp.html">Projektowe biura</a> &#8226; <a class="addax addax-cs_hl_hit_category" href="http://panoramafirm.pl/wrocław/uslugi_inzynierskie_i_budowlane_wojciech_jakszycki-oemwkh_lz.html">Budowlany nadzór</a> &#8226; <a class="addax addax-cs_hl_hit_category" href="http://panoramafirm.pl/wrocław/uslugi_inzynierskie_i_budowlane_wojciech_jakszycki-oemwkh_jzw.html">Inne</a></td> </tr> </tbody> </table> </div> <div class="bottom"> <ul style="margin: 0px;" class="linkArea"> <li><a class="findOnMap addax addax-cs_hl_hit_show_map" href="http://mapa.pf.pl/usługi+inżynierskie+i+budowlane+wojciech+jakszycki-C6812768_5827_MAP.html"><div class="left bgIcons findOnMapIco"/><div style="width: 7px;" class="widthSpacer"/>Pokaż na mapie</a></li> <li><span class="button js-addToContactFromList addax addax-cs_hl_hit_add_to_contact">Dodaj do kontaktów</span></li> <li><span style="position: absolute;" class="js-recommendFormArea hidden"><img src="http://s4.panoramafirm.pl/image/ico/ajax-loader.gif"/></span> <span rel="1" class="recommendButton js-recommendPopupBtn button addax addax-cs_hl_hit_review_click">Rekomendacje (0)</span> </li> <li><div id="js-KeywordPopup-1" class="KeywordPopup js-KeywordPopup hidden"> <div class="KeywordPopupTop"> <div class="KeywordPopupHeader">Słowa kluczowe</div> <div class="button js-close KeywordPopupClose"/> </div> <div class="KeywordPopupMiddle"> <div class="KeywordContainer"> <a href="http://panoramafirm.pl/budowlany_nadzór/dolnośląskie,,wrocław">Budowlany nadzór</a>, <a href="http://panoramafirm.pl/projektowanie_budowlane/dolnośląskie,,wrocław">projektowanie budowlane</a>, <a href="http://panoramafirm.pl/rzeczoznawca_budowlany/dolnośląskie,,wrocław">rzeczoznawca budowlany</a>, <a href="http://panoramafirm.pl/kierowanie_budową/dolnośląskie,,wrocław">kierowanie budową</a>, <a href="http://panoramafirm.pl/kierownik_budowy/dolnośląskie,,wrocław">kierownik budowy</a>, <a href="http://panoramafirm.pl/inspektor_nadzoru_budowlanego/dolnośląskie,,wrocław">inspektor nadzoru budowlanego</a>, <a href="http://panoramafirm.pl/rzeczoznawca_z_zakresu_wykonawstwa_budowlanego/dolnośląskie,,wrocław">rzeczoznawca z zakresu wykonawstwa budowlanego</a>, <a href="http://panoramafirm.pl/sporządzenie_projektów_domów/dolnośląskie,,wrocław">sporządzenie projektów domów</a>, <a href="http://panoramafirm.pl/projektowanie_domów/dolnośląskie,,wrocław">projektowanie domów</a>, <a href="http://panoramafirm.pl/adaptacja_projektów/dolnośląskie,,wrocław">adaptacja projektów</a> </div> </div> <div class="KeywordPopupBottom"/></div><div> <span rel="1" class="button js-KeywordPopupBtn addax addax-cs_hl_hit_kw">Słowa kluczowe</span></div></li> <li><div id="js-socialPopup-1" class="socialPopup js-socialPopup hidden"> <div class="socialPopupInside bgListingFill"> <div class="titleArea left"> Podziel się... </div> <div class="closeArea right"> <div class="button js-close closeBtn bgListingFill"/> </div> <div class="clear"/> <div class="js-socialPopupContent-1"><div class="textCenter" style="padding-top: 30px;"><img src="http://s4.panoramafirm.pl/image/ico/ajax-loader.gif"/></div></div> </div></div><div> <div class="bgIcons left socialIco"/> <span rel="1" class="button js-socialPopupBtn left addax addax-cs_hl_hit_share">Podziel się</span> <div class="clear"/></div></li> </ul></div> <div class="shadow"/> </div> <div rel="mhbhe_jzw" id="itemListing-2" class="listingItem searchItem searchItem-krak searchItem-silver"> <div class="fill"> <table class="table"> <tbody> <tr> <td class="logoArea" rowspan="3"> <a target="_blank" href="http://www.alfa-dach.pl" rel="nofollow" class="addax addax-cs_hl_hit_companylogotype_click"> <img border="0" title="&quot;Alfa Dach&quot; Sp. z o.o. Przedsiębiorstwo Budowlane Logo" alt="&quot;Alfa Dach&quot; Sp. z o.o. Przedsiębiorstwo Budowlane Logo" class="autoResize" src="http://panoramafirm.pl/images/4/4/005234944.gif"/> </a></td> <td class="nameArea" colspan="2"><h3><a class="js-offerName addax addax-cs_hl_hit_company_name_click" href="http://panoramafirm.pl/wrocław/alfa_dach_sp._z_o.o._przedsiebiorstwo_budowlane-mhbhe_jzw.html"> <span>B)</span> "Alfa Dach" Sp. z o.o. Przedsiębiorstwo Budowlane</a></h3></td> <td width="158" class="pictureArea" rowspan="3"> <div class="inside"><a rel="nofollow" target="_blank" href="http://www.alfa-dach.pl" class="addax addax-cs_hl_picture_click"> <img title="" alt="" src="http://panoramafirm.pl/images/6/2/005235062.jpg "/></a></div> </td> </tr> <tr> <td class="contactArea"><div class="inside"> <div class="addressArea"> <div class="left js-offerAddress">ul. Tarnogajska 14, Wrocław</div> <div class="clear"/> </div> <div class="phoneArea"> <span class="phone">tel. <a class="js-offerPhone" href="callto:+48713642222">71 364 22 22</a>, </span> fax <span class="fax">71 364 22 22</span> </div> <div class="emailArea"><a class="addax addax-cs_hl_email_submit_click" href="http://panoramafirm.pl/wyslij_wiadomosc/mhbhe_jzw.html">e-mail</a></div> <div class="wwwArea"><a target="_blank" rel="nofollow" class="addax addax-cs_hl_hit_homepagelink_click" href="http://www.alfa-dach.pl">www.alfa-dach.pl</a></div> </div></td> <td class="descriptionArea"> <div class="inside"> Przedsiębiorstwo Budowlane Alfa-Dach Sp. z o.o. to profesjonalna realizacja obiektów budowlanych w procesie generalnego wykonawstwa. Kompleksowa realizacja w systemie "pod klucz". <a class="moreButton addax addax-cs_hl_hit_more_info_click" href="http://panoramafirm.pl/wrocław/alfa_dach_sp._z_o.o._przedsiebiorstwo_budowlane-mhbhe_jzw.html">Więcej</a> <div class="spacer"/> <div class="descriptionLinks"> <a href="http://panoramafirm.pl/dolnośląskie,krzyki,wrocław,wrocław,tarnogajska/alfa_dach_sp._z_o.o._przedsiebiorstwo_budowlane-mhbhe_jzw.html"><div class="left bgIcons offerIcon addax addax-cs_hl_rfq_send_click"/></a> <a class="openHours addax addax-cs_hl_hit_opening_hours_click" href="http://panoramafirm.pl/wrocław/alfa_dach_sp._z_o.o._przedsiebiorstwo_budowlane-mhbhe_jzw.html">Godziny otwarcia</a> </div></div> </td> </tr> <tr> <td class="categoryArea" colspan="2"> Branża: <a class="addax addax-cs_hl_hit_category" href="http://panoramafirm.pl/wrocław/alfa_dach_sp._z_o.o._przedsiebiorstwo_budowlane-mhbhe_jzw.html">Budowlane inwestycje</a></td> </tr> </tbody> </table> </div> <div class="bottom"> <ul style="margin: 0px;" class="linkArea"> <li><a class="findOnMap addax addax-cs_hl_hit_show_map" href="http://mapa.pf.pl/alfa+dach+sp.+z+o.o.+przedsiębiorstwo+budowlane-C4093844_5827_MAP.html"><div class="left bgIcons findOnMapIco"/><div style="width: 7px;" class="widthSpacer"/>Pokaż na mapie</a></li> <li><span class="button js-addToContactFromList addax addax-cs_hl_hit_add_to_contact">Dodaj do kontaktów</span></li> <li><span style="position: absolute;" class="js-recommendFormArea hidden"><img src="http://s4.panoramafirm.pl/image/ico/ajax-loader.gif"/></span> <span rel="2" class="recommendButton js-recommendPopupBtn button addax addax-cs_hl_hit_review_click">Rekomendacje (0)</span> </li> <li><div id="js-KeywordPopup-2" class="KeywordPopup js-KeywordPopup hidden"> <div class="KeywordPopupTop"> <div class="KeywordPopupHeader">Słowa kluczowe</div> <div class="button js-close KeywordPopupClose"/> </div> <div class="KeywordPopupMiddle"> <div class="KeywordContainer"> <a href="http://panoramafirm.pl/roboty_budowlane/dolnośląskie,,wrocław">ROBOTY BUDOWLANE</a>, <a href="http://panoramafirm.pl/generalne_wykonawstwo/dolnośląskie,,wrocław">generalne wykonawstwo</a> </div> </div> <div class="KeywordPopupBottom"/></div><div> <span rel="2" class="button js-KeywordPopupBtn addax addax-cs_hl_hit_kw">Słowa kluczowe</span></div></li> <li><div id="js-socialPopup-2" class="socialPopup js-socialPopup hidden"> <div class="socialPopupInside bgListingFill"> <div class="titleArea left"> Podziel się... </div> <div class="closeArea right"> <div class="button js-close closeBtn bgListingFill"/> </div> <div class="clear"/> <div class="js-socialPopupContent-2"><div class="textCenter" style="padding-top: 30px;"><img src="http://s4.panoramafirm.pl/image/ico/ajax-loader.gif"/></div></div> </div></div><div> <div class="bgIcons left socialIco"/> <span rel="2" class="button js-socialPopupBtn left addax addax-cs_hl_hit_share">Podziel się</span> <div class="clear"/></div></li> </ul></div> <div class="shadow"/> </div> <div rel="odmgap_jzw" id="itemListing-3" class="listingItem searchItem searchItem-standard"> <div class="fill"> <table class="table"> <tbody> <tr> <td class="logoArea" rowspan="3"> </td> <td class="nameArea" colspan="2"><h3><a class="js-offerName addax addax-cs_hl_hit_company_name_click" href="http://panoramafirm.pl/wrocław/geovia_gmbh_sp.k.-odmgap_jzw.html"> <span>C)</span> "Geovia Gmbh" Sp.k.</a>

Odpowiedni łańcuch znaków przed linkiem to :

<a class="js-offerName addax addax-cs_hl_hit_company_name_click" href="

A po nim jest adres strony na którą chcę się dostać i kończy się zawsze poprzez

">

I to jest jedyna stałą która pozwala mi określić że jest to ten link który potrzebuję.

I teraz taka sprawa - jestem w stanie oprogramować to za pomocą wyszukiwania na podstawie pozycji szukanych ciągów ale zastanawia mnie czy jest jakiś łatwiejszy sposób aby takie adresy wyciągnąć?

Jeżeli wyrażenia regularne pozwalają na wyciągnięcie takich konkretnych linków to... nie lubię ale można powiedzieć spokojnie - czy mógłbym prosić o napisanie konkretnego kodu jaki bym potrzebował? A może jest możliwość wyciągnięcia jakoś linków po nazwie klasy? Było by to o wiele lepsze ale nie znam takiego sposobu :(

Źródło strony pobieram poprzez IdHTTP - Może lepiej poprzez WebBrowser?

Będę wdzięczny za pomoc bo obecnie będę pisał program do wyłuskania tych konkretnych linków a miło by było gdyby to było bardziej profesjonalne :)

1
Setesh napisał(a)

Witam. Czy jest możliwość aby za pomocą wyrażeń regularnych

Zasadniczo nie: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
W twoim konkretnym przypadku wystarczy uzycie nawet zwykłego string.find- znajdz cały atrybut class po którym szukasz, po nim href=" i "

1
<a class="findOnMap addax addax-cs_hl_hit_show_map" href="http://mapa.pf.pl/alfa+dach+sp.+z+o.o.+przedsiębiorstwo+budowlane-C4093844_5827_MAP.html">

Ja tu widzę takiego regexpa:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regexper {

    public static void main(String[] args) {
        Pattern p = Pattern.compile("<a class=\"findOnMap addax addax-cs_hl_hit_show_map\" href=\"(.*?)\">");
        Matcher m = p
                .matcher("<a class=\"findOnMap addax addax-cs_hl_hit_show_map\" href=\"http://mapa.pf.pl/alfa+dach+sp.+z+o.o.+przedsiębiorstwo+budowlane-C4093844_5827_MAP.html\">  <a class=\"findOnMap addax addax-cs_hl_hit_show_map\" href=\"http://mapa.pf.pl/alfa+dach+sp.+z+o.o.+przedsiębiorstwo+budowlane-C4093844_5827_MAP.html\">"); //tutaj wrzucamy nasze wejście
        while (m.find()) {
            System.out.println(m.group(1));
        }
    }
}

Czyli samo wyrażenie regularne to:

"<a class=\"findOnMap addax addax-cs_hl_hit_show_map\" href=\"(.*?)\">"

Takie coś pozwoli na wyłowienie z wejściowego tekstu linków które pasują.

0

Jeśli serio chcesz regexy to masz: /href="(.*?)"/

1
ucho napisał(a)
Setesh napisał(a)

Witam. Czy jest możliwość aby za pomocą wyrażeń regularnych

Zasadniczo nie: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
W twoim konkretnym przypadku wystarczy uzycie nawet zwykłego string.find- znajdz cały atrybut class po którym szukasz, po nim href=" i "

Czymś zupełnie innym jest parsowanie dokumentu HTML (do czego się wyrażenia regularne nie nadają, a do czego służą parsery, podobne do tych w kompilatorach), a czymś zupełnie innym szukanie jakiegoś wzorca w jakimś tekście. I właśnie to drugie chce zrobić autor (nie obchodzi go na przykład gdzie w hierarchii drzewa znajdują się elementy typu a). I podejście, które mu proponujesz niewiele różni się od użycia wyrażeń regularnych.

0

Dziękuję Wam bardzo za pomoc - muszę tylko jeszcze znaleźć sposób na oprogramowanie wyrażeń regularnych w borlandzie i przełożeniu tego z javy na c++ co już takie trudne nie powinno być :)

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