换句话说可以使用一个 /<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的内容,这两个内部特性的价值观和文本内的一个元素。

在阅读如下:

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

它看起来像实体逃脱建议处(包括在属性的)对 < >和&

如果你坚持使用普通的表达(这适用于基本串行动)试用 <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>.它应该符合属性完全和因此允许访问的内容(虽然你需要把它放在一个捕获小组)。

你也可以使用 Html灵活性包 为分析HTML,我会建议如果你要做很多的分析。维护大型经常表达可以很容易地变成一个头疼的问题,但在同时他们也更有效,如果你能够这样做。

yeah except /<tag[^>]*>.*?<\/tag>/

将不匹配一个单一的标签,但是匹配的第一次启动的标签和最后终端的标签,用于一定的标记。就像你的第一个非贪婪的标签-你在中间应该被写入非贪婪。

看看你得到的相同的结果>而不是>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top