使用Python中的正则表达式匹配两个字符串中的HTML标记

时间:2010-04-20 06:33:58

标签: python html regex

我想验证源字符串中存在的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 个答案:

答案 0 :(得分:4)

我会摆脱正则表达式并查看Beautiful Soup 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 :(得分:1)

我不认为正则表达式是正确的方法,主要是因为html并不总是只是一个字符串,但它有点复杂,嵌套标签。

我建议你使用HTMLParser,创建一个解析原始源的类,并在其上构建一个结构。然后验证相同的数据结构对于要验证的目标是否有效。