Другими словами, можно ли использовать регулярное выражение /<tag[^>]*>.*?</tag>/ для соответствия HTML-элементу tag, который не содержит вложенных элементов 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 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 говорит:
Attribute values are a mixture of text and character references, except with the additional restriction that the text cannot contain an ambiguous ampersand.






yeah except /<tag[^>]*>.*?</tag>/
Не соответствует одному тегу, но соответствует первому начальному тегу и последнему конечному тегу для данного тега. Как и ваше первое не жадное сопоставление тегов, ваш промежуточный код также должен быть написан не жадным.
Я не понимаю. Не могли бы вы привести пример?
@ j-f-sebastian: <div class = 'foo'> <span> flo </span> <div> bar </div> </div> вы соответствуете первому <div, но также и первому </ div
посмотрите, получите ли вы тот же результат, используя & gt; вместо>
Прочитав следующее:
http://www.w3.org/International/questions/qa-escapes
похоже, что экраны сущностей предлагаются везде (в том числе в атрибутах) для <> и &
Этот документ неверен. Знаки "больше чем" в содержании действительны. Он также говорит, что одиночные амперсанды неверны, но это не всегда так для HTML.
Он не говорит, что знаки «больше» недействительны, он просто рекомендует вместо этого использовать сущности - рекомендация, которую проигнорирует только дурак, ИМО. Кого волнует, действительно ли это, если большинство программистов, включая авторов многих программных инструментов, считают, что это не так?
Я считаю, что это действительно так, и валидатор W3C соглашается, но авторитетным источником этой информации является стандарт ISO 8879: 1986, который стоит ~ 150 евро / 210 долларов США. Тем не менее, их кодирование не является неправильным, поэтому, если сомневаетесь, кодируйте. Кроме того, если вы используете тип документа на основе XML, вам необходимо закодировать знаки «больше» в последовательности ]]>.
Литерал > разрешен везде в HTML-содержимом, как внутри значений атрибутов, так и в виде текста внутри элемента.
Если вы настаиваете на использовании регулярных выражений (что подходит для основных строковых операций), попробуйте использовать <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?</tag>. Он должен идеально соответствовать атрибутам и, следовательно, позволять вам получить доступ к внутреннему содержимому (хотя вам нужно поместить его в группу захвата).
Вы также можете использовать Пакет гибкости HTML для синтаксического анализа HTML, который я бы порекомендовал, если вы собираетесь выполнять большой анализ. Поддержание больших регулярных выражений может легко стать головной болью, но в то же время они намного эффективнее, если вы можете это сделать.
Да, это разрешено (W3C Validator принимает это, только выдает предупреждение).
Неэкранированные < и > также разрешены внутри комментариев, так что такое простое регулярное выражение можно обмануть.
Если BeautifulSoup не справляется с этим, это может быть ошибкой или, возможно, сознательным дизайнерским решением, чтобы сделать его более устойчивым к отсутствию закрывающих кавычек в атрибутах.
Это пример из учебника, который все используют, чтобы объяснить, почему вы не должны использовать регулярные выражения для синтаксического анализа HTML, вам следует использовать HTML Parser.