2013-04-07 3 views
0

Моя проблема у меня в том, что я хочу, чтобы захватить соответствующие ссылки с этой страницы: http://support.apple.com/kb/TS1538BeautifulSoup не захватывая динамического контента

Если я Осмотреть элемент в Chrome или Safari я могу видеть <div id="outer_related_articles"> и все статьи, перечисленные , Если я попытаюсь захватить его с помощью BeautifulSoup, он захватит страницу и все, что угодно кроме связанных статей.

Вот что я до сих пор:

import urllib2 
from bs4 import BeautifulSoup 
url = "http://support.apple.com/kb/TS1538" 
response = urllib2.urlopen(url) 
soup = BeautifulSoup(response.read()) 
print soup 
+0

BeautifulSoup - это только парсер. Я думаю, что ваша проблема более вероятна с 'urlopen'. Вы проверили, действительно ли соответствующие элементы были включены _before_, вы пытаетесь его разобрать? –

ответ

2

Этот раздел загружается с помощью Javascript. Отключите Javascript вашего браузера, чтобы увидеть, как BeautifulSoup «видит» страницу.

Здесь у вас есть два варианта:

  • Использование обезглавленный браузера, который будет выполнять Javascript. См. Следующие вопросы: Headless Browser for Python (Javascript support REQUIRED!)
  • Попробуйте выяснить, как сайт Apple загружает контент и имитирует его - вероятно, он вызывает вызов AJAX на какой-либо адрес.

После некоторого копания, кажется, он делает запрос на этот адрес (http://km.support.apple.com/kb/index?page=kmdata&requestid=2&query=iOS%3A%20Device%20not%20recognized%20in%20iTunes%20for%20Windows&locale=en_US&src=support_site.related_articles.TS1538&excludeids=TS1538&callback=KmLoader.receiveSuccess) и использует JSONP для загрузки результатов с KmLoader.receiveSuccess является именем функции приема. Используйте Firebug из инструментов Chrome для более подробной проверки страницы.

0

Я столкнулся с аналогичной проблемой, содержимое html, которое создается динамически, не может быть захвачено BeautifulSoup. Очень простое решение для этого - заставить его подождать несколько секунд, прежде чем захватывать содержимое, или вместо этого использовать Selenium, у которого есть функциональность, чтобы ждать элемент, а затем продолжить. Так для первых это сработало для меня:

import time 

# .... your initial bs4 code here 

time.sleep(5) #5 seconds, it worked with 1 second too 
html_source = browser.page_source 

# .... do whatever you want to do with bs4 
Смежные вопросы