Найти - Пользователи
Полная версия: Регулярные выражения, нужна помощь
Начало » Python для экспертов » Регулярные выражения, нужна помощь
1 2
Все ники заняты
Хочу распарсить HTML-документ, найти нужные теги. Например, найти все теги <h2>…</h2>. При этом “h” может быть и заглавной, а там, где многоточие, могут попадаться и переводы строк. Кроме того, если попадётся <h2>…</h2>…<h2>…</h2>, мне нужно, чтобы это было два совпадения, а не одно. Почитав доку, написал чушь, которая не работает:
(?s|i)<h2>.*(?!(</h2>))</h2>
Вначале пытаюсь сказать, что точка должна схватывать и переводы строк (s), плюс всё делается независимо от регистра (i). После этого пытаюсь сказать, что мне нужно всё, что угодно, что находится между “<h2>” и “</h2>”, но в этом “между” не должно попадаться самого “</h2>” (чтобы получить действительно все заголовки H2, а не отрезок документа между первым и последним таким заголовком).
Исправьте, please…
Все ники заняты
Кажись, так работает:
(?si)<h2>(.*?)</h2>
denz
А чем тебе XPath не подходит?
Все ники заняты
А что это и какая связь с регулярными выражениями?
denz
Все ники заняты
А что это и какая связь с регулярными выражениями?
XSLT - манипулирование XML
XPath - обращение к частям XML
я использую реализацию python-lxml. В твоем случае задача решаеца так:

from lxml import etree
from StringIO import StringIO
tree = etree.parse(StringIO(src))
print tree.xpath('//h2')


ХТМЛ должен быт валидным XML. Для этого можно использовать beautifulsoup.prettify().
Все ники заняты
Спасибо, но имхо, сложнее будет.
denz
А че сложного?
Зато унифицированное решение.
OlDer
denz
ХТМЛ должен быт валидным XML. Для этого можно использовать beautifulsoup.prettify().
Так, к слову. С год назад, примерно, я пробовал использовать beautifulsoup и в некоторых случаях (примерно 30% реального корявого HTML'а взятого с живых сайтов) beautifulsoup не справлялся с обработкой. Т.е. после beautifulsoup какие-то части содержания и размерки терялись.
В итоге пришлось вернуться к регулярным выражениям, хоть и не хотелось…
denz
OlDer
beautifulsoup не справлялся с обработкой.
beautifulsoup - по идее и не нужен.
Кусок рефа по lxml, только что вычитал:

HTML parsing is similarly simple. The parsers have a ``recover`` keyword
argument that the HTMLParser sets by default. It lets libxml2 try its best to
return something usable without raising an exception. Note that this
functionality depends entirely on libxml2. You should use libxml2 version
2.6.21 or newer to take advantage of this feature.
З.Ы. Будет время - протестю.
tabajara
регулярними виразами то певно не получиться. Пробував HTMLParser дуже гарно парсить і дуже просто користуватись.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB