我正在尝试从各种博客中获取一些HTML,并注意到不同的提供商以不同的方式使用相同的标记。
例如,以下是使用元名称生成器标记的两个主要提供者:
<meta content='blogger' name='generator'/>
(内容优先,名称稍后,是的,单引号!)<meta name="generator" content="WordPress.com" />
(名字优先,内容稍后)有没有办法为所有案例提取内容的价值(单/双引号,行中的第一个/最后一个)?
P.S。虽然我正在使用Java,但如果它通常用于正则表达式,答案可能会帮助更多人。
答案 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,因为它在野外”。