Проблема Beautifulsoup и AJAX-таблицы - PullRequest
0 голосов
/ 06 мая 2011

Я делаю скрипт, который очищает игры из базы данных Team Liquid от международных игр StarCraft 2. (http://www.teamliquid.net/tlpd/sc2-international/games)

Однако я сталкиваюсь с проблемой. У меня есть сценарий, проходящий по всем страницам, однако сайт Team Liquid использует какой-то AJAX, который я думаю в таблице, чтобы обновить его. Теперь, когда я использую BeautifulSoup, я не могу получить правильные данные.

Итак, я перебираю эти страницы:

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-1-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-2-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-3-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-4-1-DESC и т.д ...

Когда вы открываете их сами, вы видите разные страницы, однако мой скрипт каждый раз получает одну и ту же первую страницу. Я думаю, что это потому, что при открытии других страниц вы видите некоторое время загрузки, которое обновляет таблицу с играми до нужной страницы. Поэтому я думаю, что beatifulsoup работает быстро и должен ждать загрузки и обновления таблицы.

Итак, мой вопрос: Как я могу убедиться, что он занимает обновленную таблицу?

Теперь я использую этот код для получения содержимого таблицы, после чего помещаю содержимое в .csv:

html = urlopen(url).read().lower()
bs = BeautifulSoup(html)
table = bs.find(lambda tag: tag.name=='table' and tag.has_key('id')
                and tag['id']=="tblt_table") 
rows = table.findAll(lambda tag: tag.name=='tr')

Ответы [ 4 ]

7 голосов
/ 06 мая 2011

Когда вы пытаетесь удалить сайт с помощью AJAX, лучше всего посмотреть, что на самом деле делает код javascript. Во многих случаях он просто извлекает XML или HTML, которые было бы еще проще обработать, чем контент, не содержащий AJAXy. Это просто требует взглянуть на некоторый исходный код.

В вашем случае сайт самостоятельно извлекает HTML-код для элемента управления таблицей (вместо обновления всей страницы) по специальному URL-адресу и динамически заменяет его в DOM браузера. Глядя на http://www.teamliquid.net/tlpd/tabulator/ajax.js,, вы увидите, что этот URL отформатирован так:

http://www.teamliquid.net/tlpd/tabulator/update.php?tabulator_id=1811&tabulator_page=1&tabulator_order_col=1&tabulator_order_desc=1&tabulator_Search&tabulator_search=

Так что все, что вам нужно сделать, это очистить этот URL-адрес напрямую с BeautifulSoup и увеличивать счетчик tabulator_page каждый раз, когда вы хотите перейти на следующую страницу.

2 голосов
/ 06 мая 2011

Вы не можете просто с BeautifulSoup;он не выполняет javascript для вас.

Возможно, вам повезет больше с selenium , если вы не хотите пытаться самостоятельно анализировать соответствующий javascript и выполнять вызовы, которые AJAX будетготовлюсь к получению данных.

1 голос
/ 06 мая 2013

Для сайтов с динамическим контентом через AJAX и Javascript я использовал PhantomJS . Для этого не нужно открывать браузер, потому что он сам по себе полностью веб-браузер с возможностью создания сценариев. PhantomJS работает быстро и включает встроенную поддержку различных веб-стандартов, таких как обработка DOM, селектор CSS, JSON и Canvas.

Если вы не ниндзя JavaScript, вы должны посмотреть CasperJS , он написан поверх PhantomJS Он облегчает процесс определения полного сценария навигации и предоставляет полезные функции высокого уровня.

Вот пример того, как работает CasperJS:

CasperJs и Jquery с цепочкой Selects

0 голосов
/ 06 мая 2011

Кажется, что причина вашей проблемы в том, что ни BeautifulSoup, ни urllib не смогут выполнить javascript внутри страницы.

Возможно, вам следует использовать селен, чтобы открыть страницу в реальном браузере, затем извлечь HTML, когда он будет готов, и проанализировать его с BeautifulSoup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...