2013-11-27 68 views
3

你能從這個webpage中提取VIN號碼嗎?我試過urllib2.build_opener,請求和機械化。我也提供了用戶代理,但他們都沒有看到VIN。在python中以編程方式打開頁面

opener = urllib2.build_opener() 
opener.addheaders = [('User-agent',('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) ' 'AppleWebKit/535.1 (KHTML, like Gecko) ' 'Chrome/13.0.782.13 Safari/535.1'))] 
page = opener.open(link) 
soup = BeautifulSoup(page) 

table = soup.find('dd', attrs = {'class': 'tip_vehicleStats'}) 
vin = table.contents[0] 
print vin 
+0

你會得到什麼?整個頁面? – aIKid

+0

我得到一個空跨班,但實際上VIN號碼應該在那裏。您可以在檢查瀏覽器中的元素時看到它。 –

+0

@TeodorScorpan它是使用JavaScript動態創建的。 –

回答

5

您可以使用瀏覽器自動化工具。

例如,這個簡單的硒腳本可以做你的工作。

from selenium import webdriver 
from bs4 import BeautifulSoup 

link = "https://www.iaai.com/Vehicles/VehicleDetails.aspx?auctionID=14712591&itemID=15775059&RowNumber=0" 
browser = webdriver.Firefox() 
browser.get(link) 
page = browser.page_source 

soup = BeautifulSoup(page) 

table = soup.find('dd', attrs = {'class': 'tip_vehicleStats'}) 
vin = table.contents.span.contents[0] 
print vin 

順便說一句,table.contents[0]打印整個跨度,包括跨度標記。

table.contents.span.contents[0]僅打印VIN號。

+0

你讓我的一天! –

7

該頁面大部分信息都是用Javascript(可能通過Ajax調用)加載和顯示的,很可能是作爲防止刮擦的直接保護。因此,你需要使用運行Javascript的瀏覽器並遠程控制它,或者使用JavaScript編寫自己的JavaScript,或者你需要解構網站並找出它使用Javascript加載的內容,以及如何查看您可以複製這些電話。

+0

非常感謝Lennart Regebro。這聽起來很難實施。 =) –

+0

@TeodorScorpan嗯,我確定,因爲它不想在JavaScript中實現一個刮板。 :-)但是,如果你調試的JavaScript可能是實際的調用是簡單的Ajax調用。我認爲這是你最好的選擇。 –

+0

您是否有任何示例或教程展示如何「解構網站並重復這些調用......」我有一段時間在腦海裏回想起,並且從未看到任何真實的生活成功。 –

2

您可以使用調用瀏覽器的硒。這適用於我:

from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException 
from selenium.webdriver.common.keys import Keys 
import time 

# See: http://stackoverflow.com/questions/20242794/open-a-page-programatically-in-python 
browser = webdriver.Firefox() # Get local session of firefox 
browser.get("https://www.iaai.com/Vehicles/VehicleDetails.aspx?auctionID=14712591&itemID=15775059&RowNumber=0") # Load page 


time.sleep(0.5) # Let the page load 


# Search for a tag "span" with an attribute "id" which contains "ctl00_ContentPlaceHolder1_VINc_VINLabel" 
e=browser.find_element_by_xpath("//span[contains(@id,'ctl00_ContentPlaceHolder1_VINc_VINLabel')]") 
e.text 
# Works for me : u'4JGBF7BE9BA648275' 

browser.close() 
+0

我把這個貼在shshank的同一時間。基本上,這是相同的想法:使用硒。 –

+0

謝謝查爾斯! –