提问人:jfs 提问时间:9/19/2008 最后编辑:Deduplicatorjfs 更新时间:2/2/2015 访问量:4146
html-element 属性值中是否允许“>”(U+003E GREATER-THAN SIGN)?
Is ">" (U+003E GREATER-THAN SIGN) allowed inside an html-element attribute value?
问:
换句话说,可以使用正则表达式来匹配不包含嵌套元素的 html 元素吗?/<tag[^>]*>.*?<\/tag>/
tag
tag
例如 (lt.html):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>greater than sign in attribute value</title>
</head>
<body>
<div>1</div>
<div title=">">2</div>
</body>
</html>
正则表达式:
$ perl -nE"say $1 if m~<div[^>]*>(.*?)</div>~" lt.html
和屏幕刮刀:
#!/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
w3c 说道:
属性值是文本的混合体 和字符引用,但 附加限制 文本不能包含不明确的 符号。
答:
yeah except /<tag[^>]*>.*?<\/tag>/
不会匹配单个标签,但会匹配给定标签的第一个开始标签和最后一个结束标签。就像你的第一个非贪婪标签匹配一样,你的中间标签也应该写成非贪婪。
评论
使用 > 查看是否得到相同的结果而不是>
阅读以下内容后:
http://www.w3.org/International/questions/qa-escapes
看起来实体转义在任何地方(包括在属性中)都建议用于 < > 和 &
评论
我相信这是有效的,W3C 验证者也同意,但这些信息的权威来源是 ISO 8879:1986 标准,其成本为 ~150 欧元/210 美元。无论如何,对它们进行编码并没有错,因此如果有疑问,请进行编码。此外,如果使用的是基于 XML 的文档类型,则需要对序列中的大于符号进行编码。]]>
文字在 html 内容中的任何地方都是合法的,无论是在属性值内部还是作为元素中的文本。>
如果您坚持使用正则表达式(适用于基本字符串操作),请尝试使用 .它应该与属性完美匹配,因此允许您访问内部内容(尽管您需要将其放在捕获组中)。<tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>
你也可以使用 Html Agility Pack 来解析 HTML,如果你要进行大量的解析,我会推荐你这样做。维护大型正则表达式很容易成为令人头疼的问题,但与此同时,如果您能够这样做,它们也会更加有效。
是的,这是允许的(W3C Validator 接受它,只发出警告)。
未转义,也允许在注释中,因此这种简单的正则表达式可能会被愚弄。<
>
如果 BeautifulSoup 不能处理这个问题,它可能是一个错误,也可能是一个有意识的设计决策,以使其更灵活地避免属性中缺少结束引号。
下一个:下载加速器如何工作?
评论