换句话说,可以使用/<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
and screen-scraper:
#!/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说:
属性值是文本的混合 和字符引用,除了 额外的限制 文字不能含有歧义 符号
答案 0 :(得分:9)
是的,允许(W3C Validator接受它,只发出警告)。
在评论中也允许使用非转义<
和>
,因此可以愚弄这种简单的正则表达式。
如果BeautifulSoup没有处理这个问题,那么它可能是一个错误,也可能是一个有意识的设计决定,使其在属性中缺少关闭引号更具弹性。
答案 1 :(得分:3)
我认为这是有效的,W3C验证人同意,但该信息的权威来源是ISO 8879:1986标准,其成本约为150EUR / 210USD。无论如何,对它们进行编码并没有错,所以如果有疑问,请编码。此外,如果您使用的是基于XML的文档类型,则需要在序列]]>
中编码大于号的符号。
答案 2 :(得分:3)
文字>
在html内容中无处不在,包括属性值内部和元素内的文本。
答案 3 :(得分:2)
阅读以下内容后:
http://www.w3.org/International/questions/qa-escapes
看起来实体转义在任何地方都被建议(包括在属性中)&lt; &GT;和&amp;
答案 4 :(得分:2)
如果您坚持使用正则表达式(适用于基本字符串操作),请尝试使用<tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>
。它应该完美匹配属性,因此允许您访问内部内容(尽管您需要将其放在捕获组中)。
您也可以使用Html Agility Pack来解析HTML,如果您要进行大量的解析,我建议您这样做。保持大型正则表达式很容易成为一个令人头痛的问题,但与此同时,如果能够这样做,它们也会更有效。
答案 5 :(得分:0)
yeah except /<tag[^>]*>.*?<\/tag>/
不匹配单个标记,但匹配给定标记的第一个开始标记和最后一个结束标记。就像你的第一次非贪婪的标签匹配一样,你的中间人也应该写成非贪婪的。
答案 6 :(得分:0)
看看你是否使用&amp; gt;得到了相同的结果而不是&gt;