Парсинг простой страницы javascript

Я хотел бы очистить данные этого веб-сайта ( http://www.oddsportal.com/matches/soccer ), чтобы получить простой текстовый файл с информацией о матче и информацией о шансах следующим образом:

00:30   Criciuma - Atletico-PR                    1:2   2.70    3.24    2.41    
10:45   Vier-und Marschlande - Concordia Hamburg  0:0   4.00    3.53    1.68    
10:45   Germania Schnelsen - ASV Bergedorf 85     2:3   1.95    3.37    3.23    
10:45   Barmbecker SG - Altona                    0:2   3.67    3.37    1.82

Я раньше так делал с w3m, а сейчас вроде поменяли html на javascript и w3m не работает. Данные содержатся только в одном div. это одна запись

<tr xeid="862487"><td class="table-time datet t1333724400-1-1-0-0 ">17:00</td><td class="name table-participant" colspan="2"><a href="/soccer/italy/serie-b-2011-2012/brescia-marmi-lanza-verona-862487/">Brescia - Verona</a></td><td class="odds-nowrp" xoid="40456791" xodd="xzc0fxzxa">-</td><td class="odds-nowrp" xoid="40456793" xodd="cz0ofxz9c">-</td><td class="odds-nowrp" xoid="40456792" xodd="cz9xfcztx">-</td><td class="center info-value">17</td></tr>

Что я могу сделать?


person emanuele    schedule 06.04.2012    source источник
comment
Можете ли вы предоставить больше информации о том, как они используют Javascript? Это будет диктовать возможные решения.   -  person pjmorse    schedule 06.04.2012
comment
Я все еще вижу значения в источнике HTML.   -  person Fenikso    schedule 06.04.2012
comment
@Фениско, я не могу. как это возможно?   -  person emanuele    schedule 06.04.2012
comment
Без понятия. В Firefox я вижу таблицу в распознаваемом HTML. Так что я думаю, 20 минут работы с BeautifulSoup ;-).   -  person Fenikso    schedule 06.04.2012
comment
@Fenisko - то, что вы видите это в Firefox, не означает, что это есть в ответе.   -  person pguardiario    schedule 06.04.2012


Ответы (2)


Самый простой способ (хотя, возможно, и не самый лучший) — использовать селен/ватир. В рубине я бы сделал:

require 'watir-webdriver'
require 'csv'
@browser = Watir::Browser.new
@browser.goto 'http://www.oddsportal.com/matches/soccer/'
CSV.open('out.csv', 'w') do |out|
    @browser.trs(:class => /deactivate/).each do |tr|
        out << tr.tds.map(&:text)
    end
end
person pguardiario    schedule 06.04.2012
comment
Да, есть еще jruby и htmlunit. Я думаю, вы обнаружите, что /odd/ дает только нечетные строки. - person pguardiario; 07.04.2012

Если они используют Javascript для получения данных из службы и рендеринга их в DIV, W3M не покажет обновленный div с этими данными, потому что он не поддерживает Javascript.

У вас есть два варианта:

  • Выполните обратный инжиниринг их Javascript, чтобы узнать, откуда поступают данные, и посмотрите, сможете ли вы запросить этот источник данных напрямую, чтобы получить XML или JSON, которые они используют для обновления DIV. Тогда вы можете полностью пропустить очистку. Однако они могут не захотеть, чтобы вы это делали, и могли защитить источник данных, чтобы предотвратить это. А может и не было.

  • Используйте браузер, который выполняет Javascript, прежде чем начать парсинг. Таким образом, у вас будет div, заполненный данными. W3M-js может сделать это для вы или вы можете попробовать что-то еще (lynx или ссылки). Этот вопрос кажется связанным.

ETA: Может быть, здесь поможет PhantomJS?

person pjmorse    schedule 06.04.2012
comment
я не знаю, как получить данные от их службы. что вы имеете в виду под использованием браузера, который выполняет Javascript, прежде чем начать парсинг? мне нужно сделать это автоматически для сбора данных в разное время. - person emanuele; 06.04.2012
comment
Если вы посмотрите на исходный JS, который создает контент в своем div, он может указать, откуда он берет данные. Вы можете получить те же данные (в XML или JSON) и пропустить очистку, если они не защитили их. Что касается браузера: поскольку они используют JS для отображения данных, они рассчитывают на то, что у их зрителей включен JS. W3M не поддерживает JS, поэтому данные не отображаются. Я обновлю свой ответ соответственно. - person pjmorse; 06.04.2012
comment
w3m-js, кажется, исчез из сети :( - person emanuele; 06.04.2012
comment
Я согласен с тем, что вы говорите, за исключением части о защите данных. Если вы видите данные в браузере, вы можете их очистить. - person pguardiario; 06.04.2012
comment
Может быть. Я могу представить, что служба настроена так, чтобы в запросе требовались определенные критерии (например, файл cookie или аналогичный токен сеанса); такие критерии, безусловно, можно каким-то образом сымитировать или подделать, но это сделает регулярное получение данных из службы несколько менее простым. - person pjmorse; 06.04.2012
comment
работал у меня с PhantomJS. Использовал это как отправную точку ссылка - person vicch; 30.08.2014