2017-09-23 10 views
0

私はBeautifulSoupを使用してデータをスクリーニングしていますが、すべてが自分のコードで動作しています。私はこのコードを実行するたびにBeautifulSoupで細かい部分を削り取ることができません

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import requests 
import time 
import json 
import io 
url = "https://www.proptiger.com/all-projects" 
# for all pages https://www.proptiger.com/all-projects?page=2 
html = urlopen(url) 
soup = BeautifulSoup(html, "html.parser") 
container = soup.find_all("section", {"class":"project-card-main-wrapper"}) 
print(len(container)) 

newFile = "Prop_Data.csv" 
f = open(newFile, "w", encoding = "utf-8") 
Headers = "Project, Url, City, Builder, Price\n" 
f.write(Headers) 
#f.close() 

for i in container: 
    contain = i.find_all("div", {"class":"proj-name"}) 
    project_name = contain[0]['title'] 
    url2 = i.div['data-url'] 
    url1 = "https://www.proptiger.com" 
    url = url1+url2 
    get_city = i.find_all("span", {"itemprop":"address"})#or by div, {"class":"loc"} 
    city = get_city[0]["title"]# or by getcity.text 
    builder = i.find_all("div", {"class":"projectBuilder put-ellipsis"}) 
    bName = builder[0].text 
    price = i.find_all("div", {"class":"project-price"}) 
    pricereal = price[0].text#not able to print the print says list out of index 
    print(pricereal) 
    #f.write("{}".format(project_name) +",{}".format(url)+",{}".format(city)+",{}".format(bName)+"\n") 
#f.close() 

今では範囲外のリストは言う:私は不動産のウェブサイトをこすりしようとprice.Websiteをこすりすることができませんが「https://www.proptiger.com/all-projects」は、以下の

は私のコードですです。以下

私は最小価格と最大価格をしたいので、私はテキストを行う

<div class="project-price" itemscope="" itemtype="https://schema.org/PriceSpecification"><span itemprop="minPrice">₹ 32.4 L</span><span itemprop="maxPrice">- ₹ 88.0 L</span> 
 
      <!-- -if(project.avgPricePerUnitArea)div.text-right.price-perunit &#8377;/sq ft--> 
 
     </div>

:価格のhtmlですと56 = -6のアイテムの価格を取得し、範囲外にリストします。誰かが私が間違っていることができますか?

答えて

1

JavaScriptはJavaScript内にあるため、価格を取得できませんでした。他のすべてのアイテムが印刷されているが、価格はなぜではないのか分かりにくい。そこで、あなたはBeautifulSoupと組み合わせてセレンを使用することができます。

from bs4 import BeautifulSoup 
from selenium import webdriver 
import time 

driver = webdriver.Chrome() 
driver.get("https://www.proptiger.com/all-projects") 
time.sleep(5) 
soup = BeautifulSoup(driver.page_source, "html.parser") 
driver.quit() 

for item in soup.find_all("section", {"class":"project-card-main-wrapper"}): 
    price = item.select(".project-price")[0].text if item.select(".project-price") else "" 
    print(price) 

部分的な結果:私はここのコードの必要な部分に使用している

₹ 32.4 L- ₹ 88.0 L 
₹ 33.6 L- ₹ 51.0 L 
₹ 62.0 L- ₹ 1.25 Cr 
₹ 49.9 L- ₹ 1.32 Cr 
₹ 35.0 L- ₹ 50.0 L 

、物事をより明確にするには、下記を参照してください。

>>> import requests 
>>> link = "https://www.proptiger.com/all-projects" 
>>> page = requests.get(link).text 
>>> 'Umang Premiere' in page 
True 
>>> '₹ 35.0 L' in page 
False 
>>> 

私がやりましたそれはPython IDEで。ご覧のように、商品名は見つかりましたが、価格は表示されません。それはjavascriptのためです。それが理にかなってほしい。

+0

こんにちは、私のコードでそれを行うことは可能ですか?もし私がbeautifulSoupだけを使ってそれを望むのであれば? –

+0

私の知る限りでは:いいえ、それは不可能です。 BeautifulSoupは動的に生成されたアイテムを処理できません。ありがとう。 – SIM

+0

@ Mr.Bonesの編集を参照してください。 – SIM

1

プロジェクトの1つ(Godrej Emerald)は、リクエストに応じて価格が設定されているため、価格が設定されていないためです。

1

利用できない情報を削っているときにこのエラーが発生します。価格を見つけていて、特定のアイテムに値が表示されていない場合は、エラーが表示され、コードが破損します。あなたのコードは実際には存在しないときにそこに何かがあると言っているので、それは壊れています。

これを回避する方法は、try-except文を使用することです。

try: 
    pricereal = price[0].tex 
except: 
    pricereal = "n/a" 
+0

私は試してみましたが、それ以外は動作していませんでした...そして、私はまだなぜ疑問に思っていますか? –

+0

それはShahinが正しくなったように見えます - JavaScriptの犯人です。私は個人的にすべてのプロジェクトにSeleniumを使用しています。このような時代に使用することはもちろん、何からどこから掻き集めているかを把握するのも良いことです。 –

関連する問題