关于正则表达式:html元素属性值内是否允许使用”>”(U 003E大于标志)?

关于正则表达式:html元素属性值内是否允许使用”>”(U 003E大于标志)?

Is “>” (U+003E GREATER-THAN SIGN) allowed inside an html-element attribute value?

换句话说,可以使用/<tag[^>]*>.*?<\\/tag>/正则表达式来匹配不包含嵌套tag元素的tag html元素吗?

例如(lt.html):

正则表达式:

1
$ perl -nE"say $1 if m~]*>(.*?)~" lt.html

和屏幕抓取器:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
import sys
import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(sys.stdin)
for div in soup.findAll('div'):
    print div.string


$ python lt.py <lt.html

两者都提供相同的输出:

1
2
1
">2

预期输出:

1
2
1
2

w3c说:

Attribute values are a mixture of text
and character references, except with
the additional restriction that the
text cannot contain an ambiguous
ampersand.


是的,它是允许的(W3C验证程序接受它,只发出警告)。

在注释中也可以使用未转义的<>,因此可以对这种简单的正则表达式进行愚弄。 >

如果BeautifulSoup无法解决此问题,则可能是错误或有意识的设计决定,以使其对属性中缺少的右引号更具弹性。


文字>在html内容中的任何地方都是合法的,无论是在属性值内部还是在元素内的文本。


我相信这是有效的,并且W3C验证程序同意,但是此信息的权威来源是ISO 8879:1986标准,价格约为150EUR / 210USD。无论如何,对它们进行编码并没有错,因此,如果有疑问,请进行编码。此外,如果使用的是基于XML的文档类型,则需要按序列]]>

编码大于号。


如果您坚持使用正则表达式(适用于基本的字符串操作),请尝试使用<tag((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[^'">\\s]+))?)+\\s*|\\s*)>.*?<\\/tag>。它应该与属性完全匹配,因此允许您访问内部内容(尽管您需要将其放入捕获组中)。

您还可以使用Html Agility Pack来解析HTML,我建议您将要做很多解析。保持大型正则表达式很容易让人头疼,但是与此同时,如果您能够做到的话,它们也会更加有效。


在阅读以下内容之后:

http://www.w3.org/International/questions/qa-escapes

似乎到处都建议使用实体转义符(包括属性)对于<>和


使用>而不是>

查看是否得到相同的结果


1
yeah except /<tag[^>]*>.*?<\\/tag>/

将不匹配单个标签,但匹配给定标签的第一个开始标签和最后一个结束标签。就像您的第一个非贪婪标记匹配一样,您的中间标记也应写成非贪婪标记。


推荐阅读