抓取时无返回值

问题描述 投票:0回答:2

我正在尝试抓取一个房地产网站 - 它有 38 页。在以前的版本中,我的代码仅返回第一页上的指定值。所以我添加了一个页面范围。我确实要求重新编辑,有人说“附加到页面循环中的列表,而不是在每次迭代中设置它”,但我不完全确定如何执行此操作或哪里出错了。有人可以帮我吗?我想在所有 38 页上返回“info = [价格,地址]”。

这是我的代码:

from bs4 import BeautifulSoup
import requests

for pages in range(1,38):
        url = requests.get("https://rah.co.uk/property_area/to-buy/{page}.html".format(page =pages))

        soup = BeautifulSoup(url.content, "lxml")
        list = soup.select("ct-div-block property-outer")
        lists = soup.select("ct-div-block property-outer")

for lis in lists:
        price = lis.find("li", class_ ="ct-code-block property-price").text
        address = lis.find("li", class_ ="ct-text-block property-name").text
        info = [price, address]
        print(info)

期望返回 38 个页面中的所有值,因此它在多个页面上循环“ct-div-block property-outer”。

python loops append
2个回答
0
投票

您的代码存在一些问题:

  • 您查询的URL(格式字符串)不正确。它缺少“页面”路径参数。例如。
    https://rah.co.uk/property_area/to-buy/1.html
    指向错误处理页面。相反,您想要类似
    https://rah.co.uk/property_area/to-buy/page/5
    的东西。
  • 格式字符串放入了错误的变量。当它应该是
    pages
    时,你却得到了
    page
    。实际上你的内容是正确的,但你应该将其重命名为
    page
    ,这样更清楚其意图是什么。
  • 在另一行中,您将保留关键字
    list
    分配给 BeautifulSoup 选择器结果。您应该将其重命名为类似
    property_list
    的名称。

所以我会将变量

url
更改为如下所示:

for page in range(1,38):
  url = requests.get("https://rah.co.uk/property_area/to-buy/page/{page}".format(page=page))

0
投票

你在reddit上得到的答案是正确的。变化如下:

from bs4 import BeautifulSoup
import requests

lists = []  # ********************************************** ADDED LINE
for pages in range(1,38):
        url = requests.get("https://rah.co.uk/property_area/to-buy/{page}.html".format(page =pages))

        soup = BeautifulSoup(url.content, "lxml")
        # ********************************************** START CHANGED LINES
        relevant_content = soup.select("ct-div-block property-outer")
        lists.append(relevant_content)
        # ********************************************** END CHANGED LINES


for lis in lists:
        price = lis.find("li", class_ ="ct-code-block property-price").text
        address = lis.find("li", class_ ="ct-text-block property-name").text
        info = [price, address]
        print(info)

关于代码风格和格式的说明:

  1. 考虑使用代码编辑器(例如
    VSCode
    PyCharm
    )和 Python 代码格式化程序(例如
    black
    )。这将有助于解决代码风格问题,例如
    class_ ="...
  2. 确保名称符合逻辑,例如
    page=pages
    不读 从逻辑上讲。在循环中将
    page
    重命名为
    pages
    会使它读作
    page=page
    ,这确实符合逻辑。
  3. DRY(不要重复)并避免使用关键字作为变量名。我换了线
list = soup.select("ct-div-block property-outer")
lists = soup.select("ct-div-block property-outer")

lists.append(...)

第一行遮住了内置的

list

© www.soinside.com 2019 - 2024. All rights reserved.