[英]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 名稱相同。
由於語言的原因,我不知道您在尋找什么。 我建議..你 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.