5

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

例如,这里有两个使用元名称生成器标签不同的主要提供商:

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

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

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

4

8 回答 8

14

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

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

于 2008-08-28T02:31:40.643 回答
3

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

于 2008-08-28T02:30:42.080 回答
2

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

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

此外,如果将双引号替换为单引号将是相同的。

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

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

于 2008-08-28T02:28:16.827 回答
2

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

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

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

于 2008-08-28T02:56:03.127 回答
1

您可能想试一试 Java 的HTMLEditorKit。很容易尝试查看解析是否提供了您正在寻找的内容。

于 2008-08-28T03:24:04.213 回答
0

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

于 2008-08-28T03:20:22.693 回答
0

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

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

返回

content = "blogger"

content='Worpress.com'

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

一旦你明白了,你可以得到引号之间的所有内容,无论你选择什么,无论是另一个正则表达式(这在当时是不道德的)还是只是循环字符。

于 2008-08-28T03:38:00.547 回答
0

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

于 2008-08-28T12:53:47.090 回答