web-scraping - 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')
解决方案
您可以获取url_tag = soup.find('li', {"id": "next-page-link"})
并检查是否url_tag
为None
. 如果是,那么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 的屏幕截图):
推荐阅读
- java - 如何使用 Undertow 启用跨域源
- node.js - 成功验证电子邮件的操作
- ruby-on-rails - 如何在设置 Ruby on Rails 时安装 SQLite3?
- android - Firebase currentUser 从 Firebase DB 注销和删除用户有什么区别?
- eclipse - Javafx:无法将自定义控件导入 Scene Builder
- c++ - `Array[i]` 与 `Array+i`
- apache-pig - 无法从外部连接中找到记录
- python - rRd 定义了一个内置函数
- java - 检测 PDF 中丢失/损坏的 Unicode 映射
- apache-spark - 从 AWS S3 读取 CSV 文件