Является ли ">" (U + 003E GREATER-THAN SIGN) допустимым внутри значения атрибута html-element?
Другими словами, можно использовать /<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 говорит:
Значения атрибутов представляют собой смесь текста и символьные ссылки, за исключением дополнительное ограничение, которое текст не может содержать двусмысленный амперсанд.
Ответы
Ответ 1
Да, это разрешено (W3C Validator принимает его, только выдает предупреждение).
Unescaped <
и >
также допускаются внутри комментариев, поэтому такое простое регулярное выражение может быть обмануто.
Если BeautifulSoup не справляется с этим, это может быть ошибка или, возможно, сознательное дизайнерское решение, чтобы сделать его более устойчивым к отсутствию закрывающих кавычек в атрибутах.
Ответ 2
Я считаю, что это действительно так, и валидатор W3C согласен, но авторитетным источником этой информации является стандарт ISO 8879: 1986, который стоит ~ 150EUR/210USD. Независимо от этого, это не так, чтобы кодировать их, поэтому, если есть сомнения, кодируйте. Кроме того, если вы используете тип документа на основе XML, вам нужно кодировать знаки больше, чем в последовательности ]]>
.
Ответ 3
Literal >
является допустимым везде в html-содержимом, как внутри значений атрибута, так и как текст внутри элемента.
Ответ 4
Прочитав следующее:
http://www.w3.org/International/questions/qa-escapes
похоже, что во всех случаях (в том числе и в атрибутах) > и &
Ответ 5
Если вы настаиваете на использовании регулярных выражений (что подходит для основных операций с строкой), попробуйте использовать <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>
. Он должен идеально соответствовать атрибутам и, следовательно, позволять вам получить доступ к внутреннему контенту (хотя вам нужно поместить его в группу захвата).
Вы также можете использовать Html Agility Pack для анализа HTML, который я бы рекомендовал если вы собираетесь много разбираться. Поддержание больших регулярных выражений может легко стать головной болью, но в то же время они также намного эффективнее, если вы в состоянии это сделать.
Ответ 6
yeah except /<tag[^>]*>.*?<\/tag>/
Не будет соответствовать ни одному тегу, но будет соответствовать первому стартовому тегу и последнему тегу для данного тега. Так же, как ваш первый не-жадный совпадение тегов, ваш промежуточный должен быть написан и не жадным.
Ответ 7
посмотреть, получится ли у вас тот же результат с использованием & gt; вместо >