2012-02-04 1 views
1

나는 BeautifulSoup 및 Mechanize in Python을 사용하여 학술 프로젝트를위한 간단한 스크래핑 프로그래밍을 작성하려고합니다. 아마존에서 일부 제품의 가격을 책정하려고합니다. 가격 책정 모델에 대한 다양한 이론을 테스트하고 싶기 때문입니다. 내가 겪고있는 문제는 BeautifulSoup가 HTML의 전체 페이지를 Mechanize에서 임의로 가져 가지 않는다는 것입니다. 나는 텍스트 파일에 오류가 있으며 기계화 페이지가 완전히 형성 될 때마다 인쇄했지만 BeautifulSoup 페이지는 절반 밖에 없습니다. 나는 BeautifulSoup output이 페이지의 Mechanize output을 업로드 한BeautifulSoup이 올바르지 않음 모든 HTML 채우기

def process_product_url(product_url): 
    """Scrapes and returns all the data in the given product url""" 
    #Download product_page given product_url 
    product_page_mech, product_page_bs = get_product_page_mech_bs(product_url) 

    #Extract Price 
    price = extract_price(product_page_bs) 
    return price 

def get_product_page_mech_bs(url): 
    """Takes a product page url in str and returns the mech page and bs page""" 
    while True: 
     mech_page = get_mech_page(url) 
     bs_page = BeautifulSoup(unicode(mech_page.response().read(), 'latin-1')) 
     if not test_product_page(bs_page): 
      log(unicode(bs_page)) 
      log(unicode(mech_page.response().read(), 'latin-1')) 
      continue 
    return mech_page, bs_page 

def test_product_page(product_page_bs): 
    """Takes a BS product page and tests to see if proper""" 
    if rank_page_bs.findAll('span', attrs={'id' : 'actualPriceValue'}) == []: 
     return False 
    else: 
     return True 

def get_mech_page(url): 
    """Given a URL, returns Mechanize page object""" 
    while True: 
     try: 
      br = initialize_browser() 
      br.open(url) 
      return br 
     except Exception, e: 
      print e 
      print traceback.print_exc() 
      continue 

def initialize_browser(): 
    """Returns a fully setup mechanize browser instance""" 
    br = mechanize.Browser() 
    br.addheaders = [("User-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1")] 
    return br 

: 여기 내 코드는 HTTP : //www.amazon.com/Fujifilm-X-Pro-Digital-Camera-Body/dp/B006UV6YMQ/ref ? = sr_1_2의 = 전자 & 즉 = UTF8 & QID = 1,328,359,488 & SR = 1-2

편집 (I 두 개 이상의 링크를 붙여 넣을 수 없습니다) :

: 설명했습니다 &이
+0

만약 우리가'get_mech_page'와 누군가가 이것을 시도해 줄 수있는 URL을 구현했다면 어떨까요? – hughdbrown

+0

또,'mech_page'와'bs_page'를 출력하고,'urllib2.urlopen (url) .read()'를 사용하여 반환 된 원시 HTML과 비교할 수 있습니까? –

답변

2

내가 이런 짓을

확대
from BeautifulSoup import BeautifulSoup 
import mechanize 

def get_page_mech_bs(url): 
    """Takes a page url and returns the mech page and bs page""" 
    while True: 
     mech_page = get_mech_page(url) 
     bs_page = BeautifulSoup(unicode(mech_page.response().read(), 'latin-1')) 
     if not test_page(bs_page): 
      print "Error in page, redownloading" 
      log(unicode(bs_page)) 
      log(unicode(mech_page.response().read(), 'latin-1')) 
      continue 
     else: 
      break 
    return mech_page, bs_page 

def get_mech_page(url): 
    br = mechanize.Browser() 
    br.open(url) 
    return br 

def test_page(bs_page): 
    return True 

if __name__ == '__main__': 
    print get_page_mech_bs("http://google.com") 

test_page이 (가) 작성되었습니다. test_page이 참일 때 루프에서 빠져 나옵니다. 그리고 BeautifulSoup에서 얻은 html이 올바르게 보입니다. 뭐가 문제 야?

관련 문제