首页 > 解决方案 > bs4 findAll 没有从网站上的其他页面收集所有数据

问题描述

我正在尝试使用 BeautifulSoup 抓取一个房地产网站。我正在尝试获取伦敦的租金清单。这有效,但仅适用于网站的第一页。其中有 150 多个,所以我错过了很多数据。我希望能够从所有页面收集所有价格。这是我正在使用的代码:

import requests
from bs4 import BeautifulSoup as soup

url  = 'https://www.zoopla.co.uk/to-rent/property/central-london/?beds_max=5&price_frequency=per_month&q=Central%20London&results_sort=newest_listings&search_source=home'
response = requests.get(url)
response.status_code

data  = soup(response.content, 'lxml')

prices = []
for line in data.findAll('div', {'class': 'css-1e28vvi-PriceContainer e2uk8e7'}):
    price = str(line).split('>')[2].split(' ')[0].replace('£', '').replace(',','')
    price = int(price)
    prices.append(price)

关于为什么我不能使用此脚本从所有页面收集价格的任何想法?

额外的问题:有没有办法使用汤、IE 来访问价格并进行任何列表/字符串操作?当我打电话时,data.find('div', {'class': 'css-1e28vvi-PriceContainer e2uk8e7'})我得到以下形式的字符串<div class="css-1e28vvi-PriceContainer e2uk8e7" data-testid="listing-price"><p class="css-1o565rw-Text eczcs4p0" size="6">£3,012 pcm</p></div>

任何帮助将非常感激!

标签: pythonweb-scrapingbeautifulsoup

解决方案


您可以将参数附加&pn=<page number>到 URL 以获取下一页:

import re
import requests
from bs4 import BeautifulSoup as soup

url = "https://www.zoopla.co.uk/to-rent/property/central-london/?beds_max=5&price_frequency=per_month&q=Central%20London&results_sort=newest_listings&search_source=home&pn="

prices = []
for page in range(1, 3):  # <-- increase number of pages here
    data = soup(requests.get(url + str(page)).content, "lxml")

    for line in data.findAll(
        "div", {"class": "css-1e28vvi-PriceContainer e2uk8e7"}
    ):
        price = line.get_text(strip=True)
        price = int(re.sub(r"[^\d]", "", price))
        prices.append(price)
        print(price)
    print("-" * 80)

print(len(prices))

印刷:


...

1993
1993
--------------------------------------------------------------------------------
50

推荐阅读