Лучший способ получить различный тег HTML - PullRequest
5 голосов
/ 28 августа 2008

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

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

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

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

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

Ответы [ 8 ]

14 голосов
/ 28 августа 2008

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

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

3 голосов
/ 28 августа 2008

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

2 голосов
/ 28 августа 2008

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

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

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

2 голосов
/ 28 августа 2008

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

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

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

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

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

1 голос
/ 28 августа 2008

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

0 голосов
/ 28 августа 2008

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

0 голосов
/ 28 августа 2008

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

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

возвращает

content = "blogger"

и

content='Worpress.com'

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

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

0 голосов
/ 28 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...