获取不同HTML标记的最佳方法

时间:2008-08-28 02:23:13

标签: html regex language-agnostic

我正在尝试从各种博客中获取一些HTML,并注意到不同的提供商以不同的方式使用相同的标记。

例如,以下是使用元名称生成器标记的两个主要提供者:

  • Blogger:<meta content='blogger' name='generator'/>(内容优先,名称稍后,是的,单引号!)
  • WordPress:<meta name="generator" content="WordPress.com" />(名字优先,内容稍后)

有没有办法为所有案例提取内容的价值(单/双引号,行中的第一个/最后一个)?

P.S。虽然我正在使用Java,但如果它通常用于正则表达式,答案可能会帮助更多人。

8 个答案:

答案 0 :(得分:14)

答案是:不要使用正则表达式

严重。如果您碰巧知道它是有效的XML(可能几乎从来都不是真的),请使用SGML解析器或XML解析器。你绝对会搞砸并浪费大量的时间来试图把它弄好。只需使用已有的功能。

答案 1 :(得分:3)

实际上,您应该使用某种HTML解析器,您可以在其中检查页面DOM中的每个节点(以及节点属性)。我暂时没有使用过这些,所以我不知道它的优点和缺点,但这里有一个列表http://java-source.net/open-source/html-parsers

答案 2 :(得分:2)

根据XHTML标准,这些差异并不重要。

换句话说,它们完全是一回事。

另外,如果用单引号替换双引号则相同。

“规范化”xml文档的典型方法是使用一些将文档视为其Infoset表示的API来削减它。 DOM和SAX样式API都以这种方式工作。

如果您想手动(或使用RegEx)解析它们,您必须在代码中复制所有这些内容,在我看来,这是不切实际的。

答案 3 :(得分:2)

注意:根据the W3C HTML spec,单引号(即使没有引号,如果值不包含空格)也是有效的。引用:

  

默认情况下,SGML要求使用双引号(ASCII十进制34)或单引号(ASCII十进制39)分隔所有属性值...在某些情况下,作者可以指定属性的值而不使用任何属性值引号。

另外,不要忘记属性的顺序可以颠倒,其他属性可以出现在标签中。

答案 4 :(得分:1)

你可能想给Java HTMLEditorKit一个机会。很容易通过实验来查看解析是否提供了您要查找的内容。

答案 5 :(得分:0)

好的,既然您正在寻找与语言无关的知识,那么您可以尝试像/<meta\s.*content=.*>/这样的REGEX并从中获取结果并解析您正在寻找的特定值。我不是一个REGEX专家,所以可能有更好的方法,但在http://www.codehouse.com/webmaster_tools/regex/使用该工具时,我匹配了你提供的两个字符串。

答案 6 :(得分:0)

如果你必须使用正则表达式,这里只有一个正则表达式来获取内容部分:

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

返回

content = "blogger"

content='Worpress.com'

分别。我不是正则表达式专家,但在regexpal中给出您的示例时,它会得到这些。

一旦你得到了,你可以在你选择的引号之间获得所有内容,不管是另一个正则表达式(在那一点上只是不道德的)或者只是循环遍历字符。

答案 7 :(得分:0)

如果您使用java,您可能需要查看tagsoup,这是一个符合SAX的解析器,用于“解析HTML,因为它在野外”。