html元素属性值内是否可以使用">"(U + 003E大于符号)?
换句话说,可以使用/ <tag [^>] *>。*?<\ / tag> /
正则表达式来匹配不包含嵌套tag
元素的tag
html元素吗?
例如(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 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说:
Attribute values are a mixture of text and character references, except with the additional restriction that the text cannot contain an ambiguous ampersand.
解决方案
yeah except /<tag[^>]*>.*?<\/tag>/
将不匹配单个标签,但匹配给定标签的第一个开始标签和最后一个结束标签。就像第一个非贪婪标记匹配一样,中间标记也应写成非贪婪标记。
看看是否使用>而不是>获得相同的结果
阅读以下内容后:
http://www.w3.org/International/questions/qa-escapes
似乎在<>和&的任何地方(包括属性中)都建议使用实体转义符
我相信这是有效的,并且W3C验证程序也同意,但是此信息的权威来源是ISO 8879:1986标准,价格约为150EUR / 210USD。无论如何,对它们进行编码并没有错,因此,如果有疑问,请进行编码。另外,如果我们使用的是基于XML的文档类型,则需要在序列[]] >>中编码大于号。
文字">"在html内容中的任何地方都是合法的,无论是在属性值内部还是在元素内的文本。
如果我们坚持使用正则表达式(适用于基本的字符串操作),请尝试使用<tag((\ s + \ w +(\ s * = \ s *(?:"。*?" |'。*?'|| [^'"> \ s] +))?)+ \ s * | \ s *)>。*?<\ / tag>
。它应该与属性完全匹配,因此允许我们访问内部内容(尽管我们可以需要将其放入捕获组)。
我们还可以使用Html Agility Pack解析HTML,如果我们打算进行大量解析,我建议我们使用它。保持大的正则表达式很容易让人头疼,但是与此同时,如果可以的话,它们也会更加有效。
是的,它是允许的(W3C验证程序接受它,仅发出警告)。
注释中也可以使用未转义的<<和>
,因此可以欺骗这种简单的正则表达式。
如果BeautifulSoup不处理此问题,则可能是错误或者有意识的设计决定,以使其对属性中缺少的右引号更具弹性。