首页 > 解决方案 > BeatifulSoup - 如何在这个网站上获得分页

问题描述

我在尝试检索此链接上的分页时遇到问题:https ://timetochoose.co.ao/?search-listings=true

这是“下一页”代码:

<li id="next-page-link"><a href="https://timetochoose.co.ao/page/2/?search-listings=true">Página seguinte »</a></li>

我可以通过以下方式获取分页:

 url_tag = soup.find('li', {"id": "next-page-link"}).find('a')

但这在到达最后一页时会返回错误,我已经知道这不是最佳实践。所以我的问题是:还有另一种获取“下一页”的方法吗?如何?我知道使用 XPath 会更容易,但是自从我开始使用 BeatifulSoup 之后,我想知道是否还有其他方法。

我已经搜索了很多解决方案,但现在我感到被困而无法进步。

我还分享了我的完整代码:

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = "https://timetochoose.co.ao/?ct_keyword&ct_ct_status&ct_property_type&ct_beds&search-listings=true&ct_country=portugal&ct_price_to&ct_mls&lat&lng"

headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0'}

anuncios_ttc = {}
anuncios_nr = 0

while True:
    response = requests.get(url, headers=headers)

    print(response)

    data = response.text

    print(data)


    soup = BeautifulSoup(requests.get(url, headers=headers).content, 'html.parser')

    anuncios = soup.find_all("div", {"class": "grid-listing-info"})

    for anuncios in anuncios:
        titles = anuncios.find("a",{"class": "listing-link"}).text
        location = anuncios.find("p",{"class": "location muted marB0"}).text
        link = anuncios.find("a",{"class": "listing-link"}).get("href")
        anuncios_response = requests.get(link, headers=headers)
        anuncios_data = anuncios_response.text
        anuncios_soup = BeautifulSoup(anuncios_data, 'html.parser')
        conteudo = anuncios_soup.find("div", {"id":"listing-content"}).text
        preco = anuncios_soup.find("span",{"class": "listing-price"})
        preco_imo = preco.text if preco else "N/A"
        quartos = anuncios_soup.find("li", {"class": "row beds"})
        nr_quartos = quartos.text if quartos else "N/A"
        wcs = anuncios_soup.find("li", {"class": "row baths"})
        nr_wcs = wcs.text if wcs else "N/A"
        tipo = anuncios_soup.find("li", {"class": "row property-type"})
        tipo_imo = tipo.text if tipo else "N/A"
        bairro = anuncios_soup.find("li", {"class": "row community"})
        bairro1 = bairro.text if bairro else "N/A"
        ref = anuncios_soup.find("li", {"class": "row propid"}).text

        anuncios_nr+=1
        anuncios_ttc[anuncios_nr] = [titles, location, bairro1, preco_imo, tipo_imo, nr_quartos, nr_wcs, conteudo, ref, link]
        print("Título", titles, "\nLocalização", location, "\nPreço", preco_imo, "\nLink", link, "\nReferencia", ref, "\nTipo", tipo_imo, "\nQuartos", nr_quartos, "\nWC", nr_wcs, "\nBairro", bairro1, "\nConteudo", conteudo)

    url_tag = soup.find('li', {"id": "next-page-link"}).find('a')
    print(url_tag)
    if url_tag.get('href'):
        url = url_tag.get('href')
        print(url)
    else:
        break

print("Nr Total de Anuncios: ", anuncios_nr)

anuncios_ttc_df = pd.DataFrame.from_dict(anuncios_ttc, orient = 'index', columns =['Titulo', 'Localização', 'Bairro', 'Preço', 'Tipo', 'Quartos', 'WCs', 'Descrição', 'Referência', 'Ligação'])

anuncios_ttc_df.head()

anuncios_ttc_df.to_csv('ttc_python.csv')

标签: web-scrapingbeautifulsoup

解决方案


您可以获取url_tag = soup.find('li', {"id": "next-page-link"})并检查是否url_tagNone. 如果是,那么break

例如:

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = "https://timetochoose.co.ao/?ct_keyword&ct_ct_status&ct_property_type&ct_beds&search-listings=true&ct_country=portugal&ct_price_to&ct_mls&lat&lng"

headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0'}

anuncios_ttc = {}
anuncios_nr = 0

while True:
    soup = BeautifulSoup(requests.get(url, headers=headers).content, 'html.parser')
    anuncios = soup.find_all("div", {"class": "grid-listing-info"})

    for anuncios in anuncios:
        titles = anuncios.find("a",{"class": "listing-link"}).text
        location = anuncios.find("p",{"class": "location muted marB0"}).text
        link = anuncios.find("a",{"class": "listing-link"}).get("href")
        anuncios_response = requests.get(link, headers=headers)
        anuncios_data = anuncios_response.text
        anuncios_soup = BeautifulSoup(anuncios_data, 'html.parser')
        conteudo = anuncios_soup.find("div", {"id":"listing-content"}).text
        preco = anuncios_soup.find("span",{"class": "listing-price"})
        preco_imo = preco.text if preco else "N/A"
        quartos = anuncios_soup.find("li", {"class": "row beds"})
        nr_quartos = quartos.text if quartos else "N/A"
        wcs = anuncios_soup.find("li", {"class": "row baths"})
        nr_wcs = wcs.text if wcs else "N/A"
        tipo = anuncios_soup.find("li", {"class": "row property-type"})
        tipo_imo = tipo.text if tipo else "N/A"
        bairro = anuncios_soup.find("li", {"class": "row community"})
        bairro1 = bairro.text if bairro else "N/A"
        ref = anuncios_soup.find("li", {"class": "row propid"}).text

        anuncios_nr+=1
        anuncios_ttc[anuncios_nr] = [titles, location, bairro1, preco_imo, tipo_imo, nr_quartos, nr_wcs, conteudo, ref, link]
        print("Título", titles, "\nLocalização", location, "\nPreço", preco_imo, "\nLink", link, "\nReferencia", ref, "\nTipo", tipo_imo, "\nQuartos", nr_quartos, "\nWC", nr_wcs, "\nBairro", bairro1, "\nConteudo", conteudo)

    url_tag = soup.find('li', {"id": "next-page-link"})
    if not url_tag:
        break
    url = url_tag.find('a')['href']

print("Nr Total de Anuncios: ", anuncios_nr)
anuncios_ttc_df = pd.DataFrame.from_dict(anuncios_ttc, orient = 'index', columns =['Titulo', 'Localização', 'Bairro', 'Preço', 'Tipo', 'Quartos', 'WCs', 'Descrição', 'Referência', 'Ligação'])
print(anuncios_ttc_df)

anuncios_ttc_df.to_csv('ttc_python.csv')

印刷:

...

Nr Total de Anuncios:  27
                                               Titulo                                  Localização  ...                           Referência                                            Ligação
1                       Vivenda V4 – Tavira, Portugal                   Tavira, Algarve , Portugal  ...       Código do imóvelTTC-PT-CAS_513  https://timetochoose.co.ao/listings/vivenda-v4...
2                   Apartamento T2 – Tavira, Portugal                   Tavira, Algarve , Portugal  ...     Código do imóvelTTC-PT-2432019MR  https://timetochoose.co.ao/listings/apartament...
3                  Vivenda V4 – Vila Real Sto António    Vila Real Sto António, Algarve , Portugal  ...     Código do imóvelTTC-PT-2402018HM  https://timetochoose.co.ao/listings/vivenda-v4...
4              Apartamento T2 – Vila Real Sto António    Vila Real Sto António, Algarve , Portugal  ...     Código do imóvelTTC-PT-2392019HM  https://timetochoose.co.ao/listings/apartament...
5        Vivenda V3 – Vila Real Sto António, Portugal    Vila Real Sto António, Algarve , Portugal  ...     Código do imóvelTTC-PT-2382019SF  https://timetochoose.co.ao/listings/vivenda-v3...
6    Apartamento T2 – Vila Real Sto António, Portugal    Vila Real Sto António, Algarve , Portugal  ...     Código do imóvelTTC-PT-2222019HM  https://timetochoose.co.ao/listings/apartament...
7                           Vivenda V6 – Castro Marim             Castro Marim, Algarve , Portugal  ...     Código do imóvelTTC-PT-2232019HM  https://timetochoose.co.ao/listings/vivenda-v6...
8                  Apartamento T0 – Cabanas De Tavira                   Tavira, Algarve , Portugal  ...     Código do imóvelTTC-PT-2162019SF  https://timetochoose.co.ao/listings/apartament...
9                 Vivenda V5 – Castro Marim, Portugal             Castro Marim, Algarve , Portugal  ...     Código do imóvelTTC-PT-2132018OR  https://timetochoose.co.ao/listings/vivenda-v5...
10                      Vivenda V2 – Tavira, Portugal                   Tavira, Algarve , Portugal  ...  Código do imóvelTTC-PT-2122018SF-PA  https://timetochoose.co.ao/listings/vivenda-v2...
11                Vivenda V3 – Castro Marim, Portugal             Castro Marim, Algarve , Portugal  ...  Código do imóvelTTC-PT-2092018-HM-C  https://timetochoose.co.ao/listings/vivenda-v3...
12                  Apartamento T3 – Tavira, Portugal                   Tavira, Algarve , Portugal  ...     Código do imóvelTTC-PT-1982018AB  https://timetochoose.co.ao/listings/apartament...
13  Vivenda Com 3 Pisos – Cabanas De Tavira, Portugal                   Tavira, Algarve , Portugal  ...     Código do imóvelTTC-PT-1912018PG  https://timetochoose.co.ao/listings/v3-cabanas...
14                      Vivenda V2 - Tavira, Portugal                   Tavira, Algarve , Portugal  ...     Código do imóvelTTC-PT-1842018PG  https://timetochoose.co.ao/listings/vivenda-v2...
15                        Vivenda V5 Tavira, Portugal                   Tavira, Algarve , Portugal  ...     Código do imóvelTTC-PT-0042017MR  https://timetochoose.co.ao/listings/vivenda-v5...
16         Apartamento T2 Cabanas De Tavira, Portugal                   Tavira, Algarve , Portugal  ...         Código do imóvelTTC-PT-271SF  https://timetochoose.co.ao/listings/apartament...
17                    Quinta Em Martinlongo, Portugal              Martinlongo, Algarve , Portugal  ...         Código do imóvelTTC-PT-270OR  https://timetochoose.co.ao/listings/quinta-em-...
18                    Apartamento T3 Tavira, Portugal                   Tavira, Algarve , Portugal  ...       Código do imóvelTTC-PT-269ABMR  https://timetochoose.co.ao/listings/apartament...
19                  Apartamento T2+1 Tavira, Portugal                   Tavira, Algarve , Portugal  ...         Código do imóvelTTC-PT-268PG  https://timetochoose.co.ao/listings/apartament...
20            Apartamento T4 Duplex, Tavira, Portugal                   Tavira, Algarve , Portugal  ...         Código do imóvelTTC-PT-267AB  https://timetochoose.co.ao/listings/apartament...
21                  Apartamento T3 – Tavira, Portugal                   Tavira, Algarve , Portugal  ...         Código do imóvelTTC-PT-264PG  https://timetochoose.co.ao/listings/apartament...
22                                         Vivenda V4                   Tavira, Algarve , Portugal  ...         Código do imóvelTTC-PT-264CL  https://timetochoose.co.ao/listings/moradia-v4...
23  Vivenda Com 3 Andares, Oliveira Do Douro, Port...  Vila Nova de Gaia, Douro Litoral , Portugal  ...          Código do imóvelTTC-PT-0549  https://timetochoose.co.ao/listings/vivenda-co...
24                   Apartamento T2, Tavira, Portugal                   Tavira, Algarve , Portugal  ...         Código do imóvelTTC-PT-263JM  https://timetochoose.co.ao/listings/apartament...
25                     Vivenda  V3 – Tavira, Portugal                   Tavira, Algarve , Portugal  ...         Código do imóvelTTC-PT-254AB  https://timetochoose.co.ao/listings/moradia-v3...
26       Edifício De Turismo Rural - Serra Da Estrela     Serra da Estrela, Beira Baixa , Portugal  ...      Código do imóvelTTC-EDF-0219-PT  https://timetochoose.co.ao/listings/edificio-d...
27                    Vivenda V4+1 -malveira Da Serra               Sintra, Estremadura , Portugal  ...     Código do imóvelTTC-V4+1-0210-PT  https://timetochoose.co.ao/listings/vivenda-v4...

[27 rows x 10 columns]

并保存ttc_python.csv(来自 LibreOffice 的屏幕截图):

在此处输入图像描述


推荐阅读