Web Scraping - BeautifulSoup

0

Mam taki wycięty kawałek strony, który jest powielanym elementem w całej liście:

<div class="mpof_ki mqen_m6 mp7g_oh mh36_0 mvrt_0 mg9e_8 mj7a_8 m7er_k4 _1y62o _9c44d_1I1gg">
    <div>
        <div class="mpof_ki myre_zn m389_6m m09p_k4 mse2_56 _9c44d_2Tos9">
            <a class="msts_9u mg9e_0 mvrt_0 mj7a_0 mh36_0 mpof_ki m389_6m mx4z_6m m7f5_6m mse2_k4 m7er_k4 _9c44d_1ILhl" href="https://allegro.pl/oferta/plyta-gumowa-wykladzina-mata-3-mm-metro-guma-9549970450" rel="nofollow">
                <img alt="" data-mark="vc" src="https://a.allegroimg.com/s180/11b23e/11f760af491aacbfd46234209cc9/PLYTA-GUMOWA-WYKLADZINA-MATA-3-mm-METRO-GUMA"/>
            </a>
        </div>
    </div>
    <div class="mpof_ki myre_zn _9c44d_1Hxbq">
        <div class="m7er_k4 _9c44d_3TzmE">
            <h2 class="mgn2_14 m9qz_yp mqu1_16 mp4t_0 m3h2_0 mryx_0 munh_0">
                <a class="_w7z6o _uj8z7 meqh_en mpof_z0 mqu1_16 _9c44d_2vTdY" href="https://allegro.pl/oferta/plyta-gumowa-wykladzina-mata-3-mm-metro-guma-9549970450" title="">PŁYTA GUMOWA WYKŁADZINA MATA 3 mm, METRO GUMA</a>
            </h2>
            <div class="mpof_ki m389_6m msa3_z4 mgn2_13">
                od
                <!-- -->
                <div class="mpof_ki mp7g_oh _9c44d_tND42">
                    <div class="mp7g_oh mse2_k4 m7er_k4 _9c44d_2bELB">
                        <i class="m7er_k4 mse2_k4 _9c44d_2oIOS _9c44d_3rJUT" role="img"></i>
                        <div class="mp7g_f6 _9c44d_1_X0Q mpof_5r"></div>
                    </div>
                </div>
                <!-- -->
                Super Sprzedawcy
            </div>
            <div class="mpof_z0 m7er_k4">
                <div class="mgn2_13 mpof_5r mpof_z0_s ">
                    <dl class="mp4t_0 m3h2_0 mryx_0 munh_0 mg9e_0 mvrt_0 mj7a_0 mh36_0 meqh_en msa3_z4 _1vx3o">
                        <dt class="mpof_uk mgmw_ag mp4t_0 m3h2_0 mryx_0 munh_0 mg9e_0 mvrt_0 mj7a_0 mh36_0 _9c44d_3hPFO">Stan</dt>
                        <dd class="mpof_uk mp4t_0 m3h2_0 mryx_0 munh_0 mgmw_ia mg9e_0 mj7a_0 mh36_0 _9c44d_3n9Wf">Nowy</dd>
                    </dl>
                </div>
            </div>
        </div>
        <div class="_9c44d_3AMmE"><div class="mpof_92 myre_zn">
            <div class="msa3_z4 _9c44d_2K6FN">
                <span class="_1svub _lf05o">
                    27
                    <!-- -->
                    ,
                    <span class="_qnmdr">
                        99
                        <!-- -->
                        <!-- -->
                        zł
                    </span>
                </span>
            </div>
        </div>
            <span class="mpof_92 mgn2_13 _9c44d_3JyvE">
                <div class="mp7g_oh mse2_k4 m7er_k4 _9c44d_2bELB">
                    <span class="mpof_92 mp7g_oh m389_0a _9c44d_1BTID">
                        <i class="_9c44d_2UYuR _9c44d_1DKTg"></i>
                        z kurierem
                    </span>
                    <div class="mp7g_f6 _9c44d_1_X0Q mpof_5r"></div>
                </div>
            </span>
        </div>
        <div class="_9c44d_1xKGX">
            <div class="mqu1_g3">40,98 zł z dostawą</div>
        </div>
        <div class="_9c44d_3K52C">
            <div class="mp0t_ji mpof_vs _9c44d_1VS-Y _9c44d_3_DDQ">
                <span class="mpof_uk mqu1_ae _9c44d_18kEF _9c44d_3gH36 m9qz_yq">dostawa we wtorek</span>
            </div>
            <div class="mpof_ki m389_6m munh_56_l">
                <span class="msa3_z4">65 osób kupiło</span>
            </div>
        </div>
        <div class="m7er_k4 _9c44d_w7AeH">
            <button class="_13q9y _8hkto mh36_0 mpof_5r_x _9c44d_IH7T_">
                <span class="mpof_z0 _9c44d_38gyz">do koszyka</span>
                <span class="mpof_5r _9c44d_1CbiU">dodaj do koszyka</span>
            </button>
        </div>
    </div>
</div>

Zanim zacznę wyciągać dane ze wszystkich elementów listy przedmiotów, testuję wyciąganie potrzebnych informacji na jednym wpisie. Nie wiem czy poprawnie, ale działa:

from bs4 import BeautifulSoup

soup = BeautifulSoup(pobrana_strona,'html.parser', multi_valued_attributes=None)
soup . encode ( "utf8" )

aukcja_Nazwa = soup.find(attrs={'class':'_w7z6o _uj8z7 meqh_en mpof_z0 mqu1_16 _9c44d_2vTdY'})
print('           Url:', aukcja_Nazwa.get('href'))
print('split       Nr:', aukcja_Nazwa.get('href').split('-')[-1])
print('         Nazwa:', aukcja_Nazwa.string)

aukcja_Img = soup.find(attrs={'class':'msts_9u mg9e_0 mvrt_0 mj7a_0 mh36_0 mpof_ki m389_6m mx4z_6m m7f5_6m mse2_k4 m7er_k4 _9c44d_1ILhl'})
print('        ImgUrl:', aukcja_Img.next_element.get('src'))

aukcja_Cena = soup.find(attrs={'class':'_1svub _lf05o'})
print('text      Cena:', aukcja_Cena.text)

aukcja_CenaDostawa = soup.find(attrs={'class':'mqu1_g3'})
print('Cena z dostawą:', aukcja_CenaDostawa.text)

aukcja_Kupujących = soup.find(attrs={'class':'msa3_z4'})
print('Cena z dostawą:', aukcja_Kupujących.text)

Czy jest możliwe dokonać tego jednym wyszukaniem? Jak to powinno się robić?

1

Jednym wyszukaniem moglbys wyciagnac caly text z parent elementu, ale wtedy wyciagnie caly mozliwy text, nie tylko to co chcesz. Wtedy mozna to skorygowac regexami. Lepiej napisac sobie prosta funkcje ktora zwroci Ci text z podanego selektora. Np cos takiego. Wrzucasz sobie to w jakiegos loopa z selektorami i jazda.

def get_text(base, selector, type='class'):
        expected_text = base.find(attrs={type:selector})
        return expected_text.text
0

@ledi12:

Dziękuję za odzew.

Cały czas móżdzę problem. Doszedłem do podobnych wniosków (bo to moja pierwsza zabawa z programowaniem i z racji wieku więcej czasu potrzebuję na wizualizację zagadnień) i powoli świta mi rozwiązanie. Poznaję strukturę i jej właściwości, to ułatwia pracę :) Jak coś bardziej optymalnego opracuję to postaram się udostępnić, aby poddać ocenie.

Pozdrawiam
Maciej Z.

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