12

换句话说,可以使用/<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 $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说:

属性值是文本和字符引用的混合,除了文本不能包含不明确的 & 符号的附加限制。

4

7 回答 7

11

是的,它是允许的(W3C Validator 接受它,只发出警告)。

未转义<并且>也允许在注释中,所以这样简单的正则表达式可以被愚弄。

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

于 2008-10-19T23:10:50.607 回答
4

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

于 2008-09-18T17:33:43.107 回答
3

我相信这是有效的,W3C 验证者也同意,但此信息的权威来源是 ISO 8879:1986 标准,成本约为 150 欧元/210 美元。无论如何,编码它们并没有错,所以如果有疑问,编码。此外,如果您使用基于 XML 的文档类型,则需要在序列中编码大于号]]>

于 2008-09-18T17:14:08.270 回答
2

阅读以下内容后:

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

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

于 2008-09-18T17:12:10.303 回答
2

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

您也可以使用Html Agility Pack来解析 HTML,如果您要进行大量解析,我会推荐它。维护大型正则表达式很容易让人头疼,但与此同时,如果您能够这样做,它们也会更有效。

于 2008-09-25T02:13:56.730 回答
0
yeah except /<tag[^>]*>.*?<\/tag>/

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

于 2008-09-18T17:10:51.650 回答
0

查看是否使用 > 得到相同的结果 而不是 >

于 2008-09-18T17:11:00.510 回答