是">"(U+003E大于号)允许内部html元素的属性的价值?
题
换句话说可以使用一个 /<tag[^>]*>.*?<\/tag>/
regex到匹配的 tag
html元,其中不包含嵌套 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>
Regex:
$ 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 说:
属性的价值观是一个混合案文 和角色引用,除非有 附加的限制, 文本不包含一个含糊不清的 符号.
解决方案
是的,这是允许的(W3C验证接受它,只发出警告).
非转义 <
和 >
也许里面的意见,所以这种简单的regexp可以愚弄。
如果BeautifulSoup不处理这个问题,它可能是一个错误或许是有意识的设计的决定,使它更有弹性的,缺少关闭的报价在属性。
其他提示
我认为是有效的,并W3C验证程序的同意,但权威性的来源为这一信息是ISO8879:1986标准,其费用~须支付150欧元/210USD.无论如何,它不是错误来对它们进行编码,所以如果有疑问,编码。此外,如果您使用的是基于XML文件的类型,需要进行编码,大于号序列中 ]]>
.
文字 >
是合法处在html的内容,这两个内部特性的价值观和文本内的一个元素。
如果你坚持使用普通的表达(这适用于基本串行动)试用 <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>
.它应该符合属性完全和因此允许访问的内容(虽然你需要把它放在一个捕获小组)。
你也可以使用 Html灵活性包 为分析HTML,我会建议如果你要做很多的分析。维护大型经常表达可以很容易地变成一个头疼的问题,但在同时他们也更有效,如果你能够这样做。
yeah except /<tag[^>]*>.*?<\/tag>/
将不匹配一个单一的标签,但是匹配的第一次启动的标签和最后终端的标签,用于一定的标记。就像你的第一个非贪婪的标签-你在中间应该被写入非贪婪。
看看你得到的相同的结果>而不是>