Совпадение тегов HTML в двух строках с использованием регулярных выражений в Python - PullRequest
3 голосов
/ 20 апреля 2010

Я хочу убедиться, что теги HTML, присутствующие в исходной строке, также присутствуют в целевой строке.

Например:

>> source = '<em>Hello</em><label>What's your name</label>'
>> verify_target(’<em>Hi</em><label>My name is Jim</label>')
True
>> verify_target('<label>My name is Jim</label><em>Hi</em>')
True
>> verify_target('<em>Hi<label>My name is Jim</label></em>')
False

Ответы [ 2 ]

4 голосов
/ 20 апреля 2010

Я бы избавился от Regex и посмотрел бы на Красивый суп .
findAll(True) перечисляет все теги, найденные в вашем источнике.

from BeautifulSoup import BeautifulSoup 
soup = BeautifulSoup(source)
allTags = soup.findAll(True)
[tag.name for tag in allTags ]
[u'em', u'label']

тогда вам просто нужно удалить возможные дубликаты и сопоставить свои списки тегов.

Этот фрагмент проверяет, что ВСЕ теги источника присутствуют в тегах цели.

from BeautifulSoup import BeautifulSoup
def get_tags_set(source):
    soup = BeautifulSoup(source)
    all_tags = soup.findAll(True)
    return set([tag.name for tag in all_tags])

def verify(tags_source_orig, tags_source_to_verify):
    return tags_source_orig == set.intersection(tags_source_orig, tags_source_to_verify)

source= '<label>What\'s your name</label><label>What\'s your name</label><em>Hello</em>'
source_to_verify= '<em>Hello</em><label>What\'s your name</label><label>What\'s your name</label>'
print verify(get_tags_set(source),get_tags_set(source_to_verify))
1 голос
/ 20 апреля 2010

Я не думаю, что регулярные выражения - правильный путь, в основном потому, что html - это не всегда просто строка, а немного сложнее, с вложенными тегами.

Я предлагаю вам использовать HTMLParser , создать класс, который анализирует исходный код и строит на нем структуру. Затем убедитесь, что для проверяемых целей действует та же структура данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...