BeautifulSoup не правильно принимает весь HTML - PullRequest
1 голос
/ 04 февраля 2012

Я пытаюсь написать простое программирование для академического проекта с использованием BeautifulSoup и Mechanize в Python. Я пытаюсь получить цены на некоторые продукты от Amazon, потому что я хотел бы проверить различные теории на их моделях ценообразования. Проблема, с которой я сталкиваюсь, заключается в том, что BeautifulSoup случайным образом не берет всю страницу HTML из Mechanize. Я напечатал в текстовый файл время, когда возникает ошибка, и каждый раз, когда страница Mechanize полностью формируется, однако страница BeautifulSoup там только наполовину. Вот мой код:

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

Я загрузил вывод BeautifulSoup и Механизировать вывод этой страницы: http://www.amazon.com/Fujifilm-X-Pro-Digital-Camera-Body/dp/B006UV6YMQ/ref=sr_1_2?s=electronics&ie=UTF8&qid=1328359488&sr=1-2 (я не могу вставить более двух ссылок)

РЕДАКТИРОВАТЬ: Уточнено и расширено

1 Ответ

2 голосов
/ 04 февраля 2012

Я сделал это:

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 Истина. И HTML, который я получаю от BeautifulSoup выглядит правильно. В чем проблема?

...