html元素属性值内是否可以使用">"(U + 003E大于符号)?

时间:2020-03-06 14:22:24  来源:igfitidea点击:

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

例如(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内容中的任何地方都是合法的,无论是在属性值内部还是在元素内的文本。

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

我们还可以使用Html Agility Pack解析HTML,如果我们打算进行大量解析,我建议我们使用它。保持大的正则表达式很容易让人头疼,但是与此同时,如果可以的话,它们也会更加有效。

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

注释中也可以使用未转义的<<和>,因此可以欺骗这种简单的正则表达式。

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