簡體   English   中英

Web 使用 for 循環第 2 部分從多個頁面中抓取

[英]Web scraping from multiple pages with for loop part 2

我原來的問題:

“我創建了 web 抓取工具,用於從上市房屋中提取數據。

我在更改頁面時遇到問題。 我確實從 1 到某個數字對 go 進行了循環。

問題是這樣的:在這個 web 頁面中,最后一個“頁面”可能一直不同。 現在是 70,但明天可能是 68 或 72。如果我的范圍為(1-74),它將多次打印最后一頁,因為如果 go 超過最大值,頁面總是加載最后一頁。

然后我得到了 Ricco D 的幫助,他編寫了可以知道何時停止的代碼:

import requests
from bs4 import BeautifulSoup as bs

url='https://www.etuovi.com/myytavat-asunnot/oulu?haku=M1582971026&sivu=1000'
page=requests.get(url)
soup = bs(page.content,'html.parser')

last_page = None
pages = []

buttons=soup.find_all('button', class_= "Pagination__button__3H2wX")
for button in buttons:
    pages.append(button.text)

print(pages)

這工作得很好。

但當我嘗試將它與我的原始代碼結合起來時,它本身也可以工作,我遇到了錯誤:

Traceback (most recent call last):
  File "C:/Users/Käyttäjä/PycharmProjects/Etuoviscaper/etuovi.py", line 29, in <module>
    containers = page_soup.find("div", {"class": "ListPage__cardContainer__39dKQ"})
  File "C:\Users\Käyttäjä\PycharmProjects\Etuoviscaper\venv\lib\site-packages\bs4\element.py", line 2173, in __getattr__
    raise AttributeError(
AttributeError: ResultSet object has no attribute 'find'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

這是我得到的錯誤。

任何想法如何獲得這項工作? 謝謝

import bs4
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
import re
import requests

my_url = 'https://www.etuovi.com/myytavat-asunnot/oulu?haku=M1582971026&sivu=1'

filename = "asunnot.csv"
f = open(filename, "w")
headers = "Neliöt; Hinta; Osoite; Kaupunginosa; Kaupunki; Huoneistoselitelmä; Rakennusvuosi\n"
f.write(headers)

page = requests.get(my_url)
soup = soup(page.content, 'html.parser')

pages = []
buttons = soup.findAll("button", {"class": "Pagination__button__3H2wX"})
for button in buttons:
    pages.append(button.text)


last_page = int(pages[-1])

for sivu in range(1, last_page):

    req = requests.get(my_url + str(sivu))
    page_soup = soup(req.text, "html.parser")
    containers = page_soup.findAll("div", {"class": "ListPage__cardContainer__39dKQ"})

    for container in containers:
        size_list = container.find("div", {"class": "flexboxgrid__col-xs__26GXk flexboxgrid__col-md-4__2DYW-"}).text
        size_number = re.findall("\d+\,*\d+", size_list)
        size = ''.join(size_number)  # Asunnon koko neliöinä

        prize_line = container.find("div", {"class": "flexboxgrid__col-xs-5__1-5sb flexboxgrid__col-md-4__2DYW-"}).text
        prize_number_list = re.findall("\d+\d+", prize_line)
        prize = ''.join(prize_number_list[:2])  # Asunnon hinta

        address_city = container.h4.text

        address_list = address_city.split(', ')[0:1]
        address = ' '.join(address_list)  # osoite

        city_part = address_city.split(', ')[-2]  # kaupunginosa

        city = address_city.split(', ')[-1]  # kaupunki

        type_org = container.h5.text
        type = type_org.replace("|", "").replace(",", "").replace(".", "")  # asuntotyyppi

        year_list = container.find("div", {"class": "flexboxgrid__col-xs-3__3Kf8r flexboxgrid__col-md-4__2DYW-"}).text
        year_number = re.findall("\d+", year_list)
        year = ' '.join(year_number)

        print("pinta-ala: " + size)
        print("hinta: " + prize)
        print("osoite: " + address)
        print("kaupunginosa: " + city_part)
        print("kaupunki: " + city)
        print("huoneistoselittelmä: " + type)
        print("rakennusvuosi: " + year)

        f.write(size + ";" + prize + ";" + address + ";" + city_part + ";" + city + ";" + type + ";" + year + "\n")

f.close()

您的主要問題與您使用soup的方式有關。 您首先將BeautifulSoup as soup導入 - 然后在創建第一個 BeautifulSoup 實例時覆蓋此名稱:

soup = soup(page.content, 'html.parser')

從此時起, soup將不再是名稱庫BeautifulSoup ,而是您剛剛創建的 object。 因此,當您進一步向下嘗試創建一個新實例( page_soup = soup(req.text, "html.parser") )時,這將失敗,因為soup不再引用BeautifulSoup

所以最好的辦法是正確導入庫,如下所示: from bs4 import BeautifulSoup (或導入並用作bs - 就像 Ricco D 所做的那樣),然后像這樣更改兩條實例化行:

soup = BeautifulSoup(page.content, 'html.parser') # this is Python2.7-syntax btw

page_soup = BeautifulSoup(req.text, "html.parser") # this is Python3-syntax btw

如果您使用的是 Python3,則正確的requests -syntax 將由page.text而不是page.content因為.content在 Python3 中返回bytes ,這不是您想要的(因為 BeautifulSoup 需要一個str )。 如果您使用的是 Python2.7,您可能應該將req.text更改為req.content

祝你好運。

使用class name查找您的元素似乎不是最好的主意..因為這個。 所有下一個元素的 class 名稱相同。

多個 div 的類名相同

由於語言的原因,我不知道您在尋找什么。 我建議..你 go 到網站>按 f12>按 ctrl+f>輸入xpath ..看看你得到了什么元素。如果你不知道xpaths讀這個。 https://blog.scrapinghub.com/2016/10/27/an-introduction-to-xpath-with-examples

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM