2008-08-28 4 views
5

Я пытаюсь извлечь некоторый HTML из разных блогов и заметил, что разные поставщики используют один и тот же тег по-разному.Лучший способ получить различный тег HTML

Например, вот два основных провайдеров, которые используют мета имя генератора тегов по-разному:

  • Blogger: <meta content='blogger' name='generator'/> (содержание первого, имя позже и, да, одиночные кавычки!)
  • WordPress: <meta name="generator" content="WordPress.com" /> (имя сначала, содержание позже)

Есть ли способ извлечь значение содержимого для всех случаев (одиночные/двойные кавычки, первые/последние в строке)?

P.S. Хотя я использую Java, ответ, вероятно, поможет большему количеству людей, если это где для регулярных выражений вообще.

ответ

14

Ответ: не использовать регулярные выражения.

Серьезно. Используйте синтаксический анализатор SGML или синтаксический анализатор XML, если вам известно, что он является корректным XML (возможно, почти никогда не выполняется). Вы абсолютно испортите и потратите массу времени, пытаясь понять это правильно. Просто используйте то, что уже доступно.

2

Эти различия не очень важны в соответствии со стандартом XHTML.

Другими словами, это точно то же самое.

Кроме того, если вы замените двойные кавычки одиночными кавычками, то будет одинаково.

Типичным способом «нормализации» XML-документа является его очистка с использованием некоторого API, который рассматривает документ как представление Infoset. И API DOM, и SAX-стиль работают именно так.

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

3

На самом деле, вероятно, вы должны использовать какой-то HTML-парсер, где вы можете проверить каждый узел (и, следовательно, атрибуты узла) в DOM страницы. Я не использовал ни одного из них на некоторое время, так что я не знаю, плюсы и минусы, но вот список http://java-source.net/open-source/html-parsers

2

Примечание: одинарные кавычки (даже без кавычек, если значение не содержит пробела) действительны в соответствии с the W3C HTML spec. Цитата:

По умолчанию, SGML требует, чтобы все значения атрибутов разграничиваются с использованием либо двойные кавычки (ASCII десятичное 34) или одинарные кавычки (ASCII десятичное 39) ... В некоторых случаях авторы могут указывать значение атрибута без кавычек.

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

0

Хорошо, так как вы ищете язык-агностик, тогда вы можете попробовать REGEX как /<meta\s.*content=.*>/ и получить результат от этого и проанализировать определенные значения, которые вы ищете. Я никоим образом не являюсь экспертом REGEX, поэтому, вероятно, есть лучший способ, но при использовании инструмента в http://www.codehouse.com/webmaster_tools/regex/ я сопоставил обе строки, которые вы предоставили.

1

Возможно, вы захотите дать HTMLEditorKit Java. Легко поэкспериментировать, чтобы убедиться, что синтаксический анализ обеспечивает то, что вы ищете.

0

Если вы должны использовать регулярное выражение, вот регулярное выражение, чтобы получить только содержательная часть:

content\s*=\s*['"].*?['"] 

возвращает

content = "blogger" 

и

content='Worpress.com' 

соответственно. Я не эксперт по регулярному выражению, но он получает те, которые приведены в ваших примерах в regexpal.

Как только вы получите это, вы можете получить все между кавычками, но вы выбираете, будь то другое регулярное выражение (которое просто аморально в этой точке) или просто перебирает символы.

0

Если вы используете java, вы можете посмотреть на tagsoup, который является SAX-совместимым синтаксическим анализатором для «[разбора] HTML, как он встречается в дикой природе».

Смежные вопросы