Сопоставить записи RSS с текстом HTML. W. неточный поиск - PullRequest
1 голос
/ 13 декабря 2008

Как бы вы решили эту проблему?

Вы просматриваете HTML блогов. Часть HTML-кода блога - это сообщения блога, некоторые из них - форматирование, боковые панели и т. Д. Вы хотите иметь возможность определить, какой текст в HTML-документе принадлежит какому-либо сообщению (то есть постоянная ссылка), если он есть.

Я знаю, о чем вы думаете: вы можете просто посмотреть RSS и полностью игнорировать HTML! Тем не менее, RSS очень часто содержит только очень короткие выдержки или удаляет ссылки, которые могут вас заинтересовать. Вы хотите по существу победить выдержку RSS, используя вместе HTML и RSS одной и той же страницы.

Запись RSS выглядит так:

title
excerpt of post body
permalink

Сообщение в блоге в HTML выглядит так:

title (surrounded by permalink, maybe)
...
permalink, maybe
...
post body
...
permalink, maybe

Таким образом, страница HTML содержит те же поля, но расположение постоянной ссылки заранее неизвестно, и поля будут разделены неким шумовым текстом, который в основном представляет собой HTML и пробел, но также может содержать некоторые дополнительные метаданные, такие как " отправил Джонни "или дата или что-то в этом роде. Текст также может быть немного отличен в HTML и RSS, как описано ниже.

Дополнительные правила / предостережения:

  • Названия не могут быть уникальными. Это происходит чаще, чем вы думаете. Примеры, которые я видел: "Сводка новостей по понедельникам", "TGIF" и т. Д.
  • Заголовки можно даже оставить пустыми.
  • Выдержки в RSS также необязательны, но предполагается, что должен быть хотя бы непустой отрывок или непустой заголовок
  • Отрывок RSS может содержать полный контент сообщения, но, скорее всего, содержит короткий отрывок начала тела сообщения
  • Предположим, что постоянные ссылки должны быть уникальными и одинаковыми как в HTML, так и в RSS.
  • Заголовок, выдержка и текст сообщения могут быть немного по-разному отформатированы в RSS и HTML. Например:
    • У RSS может быть HTML внутри заголовка или разделенного тела, или на HTML-странице может быть добавлено больше HTML (например, окружение первой буквы тела сообщения чем-либо) или может быть отформатирован немного по-другому
    • Текст может кодироваться немного по-другому, например, быть utf8 в RSS, в то время как символы не ascii в HTML всегда кодируются с использованием амперсанда. Однако предположим, что это текст на английском языке, где символы, отличные от ascii, встречаются редко.
    • Там может быть плохо закодированная ужасность Windows-1252. Это часто случается с символами, такими как фигурные кавычки. Тем не менее, можно с уверенностью предположить, что большая часть текста является ascii.
    • Там может быть складывание в любом направлении, особенно в заголовке. Таким образом, они могут использовать заглавные буквы на HTML-странице, но не в RSS.
  • Число записей в ленте RSS и странице HTML не должно совпадать. Либо может быть больше или меньше старых записей. Мы можем ожидать только те сообщения, которые появляются в обоих.
  • RSS может отставать. На странице HTML может появиться новая запись, которая пока не отображается в ленте RSS. Это может произойти, если RSS-канал распространяется через Feedburner. Опять же, мы можем ожидать разрешения только тех сообщений, которые появляются как в RSS, так и в HTML.
  • Тело сообщения может быть очень коротким или очень длинным.
Точность

100% составляет , а не ограничение. Однако чем точнее, тем лучше.

Ну, что бы вы сделали?

Ответы [ 2 ]

1 голос
/ 28 января 2009

Я бы создал скребок для каждого из основных движков блогов. Начните с основного текста для одного сообщения на странице.

Если вам повезет, то движок предоставит разумный XHTML, так что вы можете найти ряд полезных выражений XPath, чтобы получить узел, соответствующий статье. Если нет, то я боюсь, что это TagSoup или Tidy , чтобы привести его в правильно сформированный XML.

Оттуда вы можете искать метаданные и полный текст. Это должно безопасно удалить верхние / нижние колонтитулы / боковые панели / виджеты / рекламные объявления, хотя они могут оставить встроенные объекты и т. Д.

Также должно быть довольно легко (TM) сегментировать страницу на метаданные статьи, текст, комментарии и т. Д. И т. Д. И помещать их в довольно разумный элемент RSS / Atom.

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

Как только у вас появится скребок для движка блога, вы можете начать писать детектор - что послужит основой для «данной страницы, с каким движком блога она была опубликована».

При наличии достаточного количества скребков и детекторов должна быть возможность указать конкретный канал RSS / Atom и преобразовать его в полнотекстовый канал.

Однако у этого подхода есть ряд проблем:

  • , хотя вы можете настроить таргетинг на большие 5 блоговых движков, могут существовать некоторые блоги, которые вам просто необходимы, но они не охватываются ими: например, в википедии перечислено 61 двигателей ; люди, которые пишут свои собственные движки для блогов, нуждаются в собственном скребке.
  • каждый раз, когда движок блога меняет версии, вам нужно менять детекторы и скребки. Точнее, нужно добавить новый скребок и детектор. Детекторы должны становиться все более суетливыми, чтобы различать одну версию одного и того же движка (например, каждый раз, когда меняется слеш-код , обычно изменяется HTML, но разные сайты использовать разные версии косой черты).

Я пытаюсь придумать достойный запасной вариант, но я отредактирую, как только у меня будет.

0 голосов
/ 14 декабря 2008

RSS на самом деле довольно просто проанализировать с помощью XPath любой XML-анализатор (или регулярные выражения, но это не рекомендуется), вы проходите через теги , ища , , .

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

...