我正在尝试抓取一个房地产网站 - 它有 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”。
您的代码存在一些问题:
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))
你在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)
关于代码风格和格式的说明:
VSCode
、PyCharm
)和 Python 代码格式化程序(例如 black
)。这将有助于解决代码风格问题,例如 class_ ="...
。page=pages
不读
从逻辑上讲。在循环中将 page
重命名为 pages
会使它读作 page=page
,这确实符合逻辑。list = soup.select("ct-div-block property-outer")
lists = soup.select("ct-div-block property-outer")
与
lists.append(...)
第一行遮住了内置的
list
。