Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Типичный способ "нормализации" xml-документа - это его обработка с помощью некоторого API, который обрабатывает документ как представление информационного набора.Таким образом, работают как API в стиле DOM, так и SAX.

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

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

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

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

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

Хорошо, поскольку вы ищете независимое от языка, вы можете попробовать РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ типа /<meta\s.*content=.*>/ и извлеките из этого результат и проанализируйте конкретные значения, которые вы ищете.Я ни в коем случае не специалист по РЕГУЛЯРНЫМ выражениям, так что, вероятно, есть способ получше, но при использовании инструмента в http://www.codehouse.com/webmaster_tools/regex/ Я сопоставил обе предоставленные вами строки.

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

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

ВОЗВРАТ

content = "blogger"

и

content='Worpress.com'

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top