Разрешено ли “>” (U + 003E БОЛЬШЕ ЗНАКА) внутри значения атрибута html-элемента?

StackOverflow https://stackoverflow.com/questions/94528

  •  01-07-2019
  •  | 
  •  

Вопрос

Другими словами, можно ли использовать /<tag[^>]*>.*?<\/tag>/ регулярное выражение, соответствующее 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>

Регулярное выражение:

$ 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 Validator принимает это, только выдает предупреждение).

Не Избежавший опасности < и > также разрешены внутри комментариев, поэтому такое простое регулярное выражение можно обмануть.

Если BeautifulSoup не справляется с этим, это может быть ошибка или, возможно, сознательное дизайнерское решение сделать его более устойчивым к отсутствию закрывающих кавычек в атрибутах.

Другие советы

Я считаю, что это действительно, и валидатор W3C согласен, но авторитетным источником этой информации является стандарт ISO 8879: 1986, который стоит ~ 150EUR / 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