我试图从不同的博客中获取一些 HTML,并注意到不同的提供商以不同的方式使用相同的标签。

例如,以下两个主要提供商以不同的方式使用元名称生成器标签:

  • 博主: <meta content='blogger' name='generator'/> (内容第一,名称第二,是的,单引号!)
  • WordPress: <meta name="generator" content="WordPress.com" /> (先名称,后内容)

有没有办法提取所有情况下的内容值(单引号/双引号,行中的第一个/最后一个)?

附:虽然我使用的是 Java,但如果它适用于正则表达式,答案可能会帮助更多的人。

有帮助吗?

解决方案

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

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

其他提示

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

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

换句话说,它们是完全相同的东西。

另外,如果将双引号替换为单引号,效果也是一样的。

“规范化”XML 文档的典型方法是使用一些将文档视为其 Infoset 表示形式的 API 来对其进行精简。DOM 和 SAX 风格的 API 都是这样工作的。

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

笔记:单引号(即使没有引号,如果值不包含空格)根据以下规则有效 W3C HTML 规范. 。引用:

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

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

你可能想给 Java 的 HTML编辑器工具包 一枪。很容易进行试验,看看解析是否提供了您正在寻找的内容。

好的,既然您正在寻找与语言无关的内容,那么您可以尝试像这样的正则表达式 /<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