Разбор результата, полученного из mochiweb_html

Я хотел бы проанализировать некоторый контент из HTML-файла (без XML).

На данный момент я получаю структуру для анализа, используя mochiweb_html:

1> inets:start().
2> {ok, {Status, Headers, Body}} = httpc:request("http://www.google.com").
3> {String, Attributes, Other} = mochiweb_html:parse(Body).

и результат примерно такой:

{<<"html">>,
 [{<<"itemscope">>,<<"itemscope">>},
  {<<"itemtype">>,<<"http://schema.org/WebPage">>}],
 [{<<"head">>,[],
   [{<<"meta">>,
     [{<<"itemprop">>,<<"image">>},
      {<<"content">>,<<"/images/google_favicon_128.png">>}],
     []},
    {<<"title">>,[],[<<"Google">>]},
....

Каков наилучший способ извлечь из структуры, полученной из mochiweb_http, все элементы веб-страницы, которые имеют определенный тег с определенным классом (например, <span id="footer">)?

2 ответа

Решение

Вы можете использовать mochiweb_xpath:

> mochiweb_xpath:execute("//span[@id='footer']",
    mochiweb_html:parse(
      "<html><body><span>not this one</span><span id='footer'>but this one</span></body></html>")).
[{<<"span">>,
  [{<<"id">>,<<"footer">>}],
  [<<"but this one">>]}]

Это зависит от ваших требований к производительности.

Результат mochiweb представлен в форме трех кортежей, которые, вероятно, довольно легко можно преобразовать во входные данные, подходящие для xmerl. Большая часть работы будет преобразовывать имена атрибутов в атомы. Затем вы можете использовать xmerl_xpath для выполнения довольно гибких запросов.

В противном случае вы могли бы написать что-то менее гибкое (но, возможно, более быстрое) для обхода дерева.

Другие вопросы по тегам