“Умный” способ проанализировать и использовать данные веб-сайта?

Я думаю, что необходимо считать Douglas Crockford Наследование Prototypal в JavaScript и Классическое Наследование в JavaScript.

Примеры от его страницы:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Эффект? Это позволит Вам добавлять методы более изящным способом:

function Parenizor(value) {
    this.setValue(value);
}

Parenizor.method('setValue', function (value) {
    this.value = value;
    return this;
});

я также рекомендую его видео: Усовершенствованный JavaScript.

можно найти больше видео на его странице: http://javascript.crockford.com/ В книге John Reisig можно найти много примеров от веб-сайта Douglas Crockfor.

31
задан Charles Stewart 3 January 2010 в 06:50
поделиться

10 ответов

Я сделал кое-что из этого недавно, и вот мой опыт.

Существует три основных подхода:

  1. Регулярные выражения.
    • Наиболее гибкий, самый простой в использовании, со слабо структурированной информацией и изменяющимися форматами.
    • Труднее выполнять структурный анализ / анализ тегов, но легче выполнять сопоставление текста .
    • Встроенная проверка форматирования данных.
    • Сложнее поддерживать, чем другие, потому что вам нужно писать регулярное выражение для каждого шаблона, который вы хотите использовать для извлечения / преобразования документа
    • Обычно медленнее, чем 2 и 3 .
    • Хорошо работает для списков элементов аналогичного формата.
    • Хороший инструмент разработки / тестирования регулярных выражений и несколько примеров страниц помогут. У меня есть хорошие отзывы о RegexBuddy. Попробуйте их демо.
    • Мне это удалось больше всего. Гибкость позволяет работать с отвратительным, грубым и непривычным HTML-кодом.
  2. Конвертируйте HTML в XHTML и используйте инструменты извлечения XML. Очистите HTML, преобразуйте его в разрешенный XHTML и используйте XPath / XQuery / X-something, чтобы запросить его как данные XML.
    • Инструменты: TagSoup, HTMLTidy и т. Д.
    • Качество преобразования HTML в XHML ОЧЕНЬ важно и сильно варьируется.
    • Лучшее решение, если данные, которые вам нужны, структурированы с помощью макета HTML и тегов (данные в HTML таблицы, списки, группы DIV / SPAN и т. д.)
    • Наиболее подходит для получения структур ссылок, вложенных таблиц, изображений, списков и т. д.
    • Должен быть быстрее, чем вариант 1, но медленнее, чем вариант 3.
    • Хорошо работает, если форматирование содержимого изменяется / является переменным, но структура / макет документа - нет.
    • Если данные не структурированы с помощью тегов HTML, у вас проблемы.
    • Можно использовать с опцией 1.
  3. ] Генератор парсеров (ANTLR и т.д.) - создает грамматику для синтаксического анализа и анализа страницы.
    • Я не пробовал это, потому что это не подходило для моих (грязных) страниц.
    • Наиболее подходит, если структура HTML сильно структурирована, очень постоянна, регулярна и никогда не меняется.
    • Используйте это, если в документе есть легко описываемые шаблоны, но они не включают HTML-теги и включают рекурсию или сложное поведение.
    • Не требует ввода XHTML.
    • БЫСТРАЯ пропускная способность, как правило
    • Большая кривая обучения, но проще в обслуживании

Я возился с веб-сборщиком для варианта 2, но я нахожу их синтаксис немного странным. Смесь XML и некоторого языка сценариев псевдо-Java. Если вам нравится Java и нравится извлечение данных в стиле XML (XPath, XQuery), это может быть билетом для вас.


Изменить: если вы используете регулярные выражения, убедитесь, что вы используете библиотеку с ленивыми квантификаторами и группами захвата! PHP ' В старых библиотеках регулярных выражений они отсутствуют, и они незаменимы для сопоставления данных между тегами открытия / закрытия в HTML.

24
ответ дан 27 November 2019 в 22:39
поделиться

Попробуйте поискать в Google очистку экрана + язык, который вы предпочитаете. Я знаю несколько вариантов Python, вы можете найти эквивалент для предпочитаемого вами языка:

  • Beatiful Soup
  • Mechanize: аналогично Perl WWW: Mechanize. Предоставляет объект, подобный браузеру, для взаимодействия с веб-страницами
  • lxml: привязка python к libwww
  • scrapemark: использует шаблоны для очистки фрагментов страниц
  • pyquery: позволяет выполнять запросы jQuery в документах xml / xhtml
  • scrapy: высокоуровневый фреймворк для сканирования и сканирования веб-страниц для написания пауков для сканирования и анализа веб-страниц

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

1
ответ дан 27 November 2019 в 22:39
поделиться

Без фиксированной структуры HTML для анализа, Я бы не хотел поддерживать регулярные выражения для поиска данных. Возможно, вам больше повезет с анализом HTML с помощью подходящего парсера, который строит дерево. Затем выберите элементы ... которые были бы более удобными в обслуживании.

Очевидно, что лучший способ - это какой-нибудь XML-вывод из механизма с фиксированной разметкой, который вы можете проанализировать и проверить. Я бы подумал, что библиотека синтаксического анализа HTML с некоторыми «в темноте» зондирование созданного дерева было бы проще поддерживать, чем регулярные выражения.

Таким образом, вам просто нужно проверить ... превращается в ... или что-то в этом роде.

В итоге, поиск определенных элементов с помощью регулярного выражения был бы мрачным. Лучшим подходом является построение DOM-подобной модели страницы и поиск «привязок» к символьным данным в тегах.

Или отправить электронное письмо на сайт с указанием аргумента в пользу XML API. .. вас могут нанять!

В итоге, использование регулярного выражения для определенных элементов было бы мрачным. Лучшим подходом является построение модели страницы, подобной DOM, и поиск «привязок» к символьным данным в тегах.

Или отправка электронной почты на сайт с заявлением о необходимости использования XML API. .. вас могут нанять!

В итоге, использование регулярного выражения для определенных элементов было бы мрачным. Лучшим подходом является построение модели страницы, подобной DOM, и поиск «привязок» к символьным данным в тегах.

Или отправка электронной почты на сайт с заявлением о необходимости использования XML API. .. вас могут нанять!

3
ответ дан 27 November 2019 в 22:39
поделиться

Вы не говорите, на каком языке говорите. В мире Java вы можете использовать TagSoup и XPath, чтобы минимизировать неудобства. Вот пример из этого блога (конечно, XPath может быть намного сложнее, если того требуют ваши нужды):

URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);

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

Вот пример XPath, который я определенно не использую для сканирования этого сайта. Ни в коем случае, не я:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3"
3
ответ дан 27 November 2019 в 22:39
поделиться

Вы не упомянули, какой стек технологий вы используете. Если вы разбираете HTML, я бы использовал библиотеку синтаксического анализа:

Существуют также веб-службы, которые делают именно то, что вы поговорка - коммерческая и бесплатная. Они очищают сайты и предлагают интерфейсы веб-сервисов.

И общий веб-сервис, который предлагает некоторую очистку экрана, - это Yahoo Pipes. предыдущий вопрос о переполнении стека по этому

2
ответ дан 27 November 2019 в 22:39
поделиться

Это не надежно, но вы можете посмотреть парсер, такой как Beautiful Soup Он не сможет волшебным образом найти ту же информацию, если макет изменится, но это намного проще, чем писать сложные регулярные выражения. Обратите внимание, что это модуль Python.

2
ответ дан 27 November 2019 в 22:39
поделиться

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

В качестве альтернативы вы можете придерживаться небольших наборов данных, предоставляемых API. Yahoo очень усердно работает над предоставлением данных с возможностью поиска через API (см. YDN), я думаю, что Amazon API открывает много книжных данных и т. Д. И т. Д.

Надеюсь, что это немного поможет!

РЕДАКТИРОВАТЬ: И если вы используете PHP, я бы рекомендовал SimpleHTMLDOM

1
ответ дан 27 November 2019 в 22:39
поделиться

Вы изучали возможность использования библиотеки обработки HTML? У Ruby есть несколько довольно хороших. например, hpricot

С хорошей библиотекой вы можете указать части страницы, которые вы хотите, используя селекторы CSS или xpath. Это было бы намного надежнее, чем использование регулярных выражений.

Пример из hpricot wiki:

 doc = Hpricot(open("qwantz.html"))
 (doc/'div img[@src^="http://www.qwantz.com/comics/"]')
   #=> Elements[...]

Я уверен, что вы могли бы найти библиотеку, которая делает аналогичные вещи в .NET, Python и т. Д.

1
ответ дан 27 November 2019 в 22:39
поделиться

Если вы можете использовать что-то вроде Tag Soup , то это будет место для начала. Тогда вы могли бы рассматривать страницу как XML API, вроде как.

Она имеет реализацию на Java и C ++, может работать!

0
ответ дан 27 November 2019 в 22:39
поделиться

Parsley на http://www.parselets.com выглядит довольно привлекательно.

Он позволяет вам определять «парслеты» с помощью JSON, что вы определяете, что и ищите на странице, а затем он анализирует эти данные для вас.

0
ответ дан 27 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: