获取不同HTML标记的最佳方法
我试图从各种博客中获取一些HTML,并且注意到不同的提供程序以不同的方式使用相同的标记。
例如,以下是两个主要提供商,它们以不同的方式使用元名称生成器标签:
- Blogger:
<meta content ='blogger'name ='generator'/>
(首先是内容,然后是名称,是的,单引号!) - WordPress:
<元名称=" generator" content =" WordPress.com" />
(名称优先,内容优先)
有没有一种方法可以提取所有情况下的内容值(单引号/双引号,行首/尾)?
P.S.尽管我使用的是Java,但如果将答案放在通常的正则表达式中,答案可能会帮助更多的人。
解决方案
回答
根据XHTML标准,这些差异并不是很重要。
换句话说,它们是完全一样的。
另外,如果将双引号替换为单引号,则将是相同的。
"标准化" xml文档的典型方法是使用将文档视为其Infoset表示形式的API对其进行解析。 DOM和SAX样式的API均以这种方式工作。
如果要手动(或者使用RegEx)解析它们,则必须在代码中复制所有这些内容,我认为这不切实际。
回答
实际上,我们可能应该使用某种HTML解析器,在其中可以检查页面DOM中的每个节点(并因此检查节点属性)。我已经有一段时间没有使用任何这些了,所以我不知道其优缺点,但这是列表http://java-source.net/open-source/html-parsers
回答
答案是:不要使用正则表达式。
严重地。如果我们碰巧知道它是有效的XML(可能几乎从不真实),请使用SGML解析器或者XML解析器。我们将彻底搞砸,浪费大量时间来尝试解决问题。只需使用现有的即可。
回答
注意:根据W3C HTML规范,单引号(即使该值不包含空格,即使没有引号)也有效。引用:
By default, SGML requires that all attribute values be delimited using either double quotation marks (ASCII decimal 34) or single quotation marks (ASCII decimal 39)... In certain cases, authors may specify the value of an attribute without any quotation marks.
同样,不要忘记属性的顺序可以颠倒,其他属性也可以出现在标记中。
回答
好的,由于我们正在寻找与语言无关的语言,因此我们可以尝试使用REGEX之类的/<meta\s.*content =。*> /
,然后从中获取结果并解析出所需的特定值。我绝不是REGEX专家,所以也许有更好的方法,但是使用http://www.codehouse.com/webmaster_tools/regex/上的工具时,我匹配了我们提供的两个字符串。
回答
我们可能想尝试一下Java的HTMLEditorKit。可以很容易地进行试验,以查看解析是否提供了所需的内容。
回答
如果必须使用正则表达式,则这里是一个仅获取内容部分的正则表达式:
content\s*=\s*['"].*?['"]
退货
content = "blogger"
和
content='Worpress.com'
分别。我不是正则表达式专家,但是当我们在正则表达式中给出示例时,它会得到那些。
一旦获得,我们就可以选择使用引号之间的所有内容,无论是其他正则表达式(在当时是不道德的)还是仅循环字符。
回答
如果我们使用的是Java,则可能要看一下tagoup,这是SAX兼容的解析器,用于" [在野外发现HTML]"。