正则表达式将特定HTML字符串与Python匹配

时间:2015-03-31 01:55:44

标签: python regex

模式如下

page_pattern = 'manual-data-link" href="(.*?)"'

匹配函数如下,其中pattern是上述page_pattern

之类的预定义模式之一
def get_pattern(pattern, string, group_num=1):
    escaped_pattern = re.escape(pattern)
    match = re.match(re.compile(escaped_pattern), string)

    if match:
        return match.group(group_num)
    else:
        return None

问题是匹配始终为None,即使我确保它与http://pythex.org/一起正常工作。我怀疑我没有正确地编译/转发模式。

测试字符串

<a class="rarity-5 set-102 manual-data-link" href="/data/123421" data-id="20886" data-type-id="295636317" >Data</a>

2 个答案:

答案 0 :(得分:4)

你有三个问题。

1)在这种情况下,您不应该致电re.escapere.escape会阻止特殊字符(例如.*?)具有其特殊含义。你希望他们在这里有特殊含义。

2)您应该使用re.search,而不是字符串开头的re.match re.match个匹配项;你想在字符串中的任何地方找到匹配。

3)You shouldn't parse HTML with regular expressions。使用专为此工作设计的工具,如BeautifulSoup。

答案 1 :(得分:3)

re.match尝试从字符串的开头进行匹配。由于您要匹配的字符串位于中间位置,因此您需要使用re.search代替re.match

>>> import re
>>> s = '<a class="rarity-5 set-102 manual-data-link" href="/data/123421" data-id="20886" data-type-id="295636317" >Data</a>'
>>> re.search(r'manual-data-link" href="(.*?)"', s).group(1)
'/data/123421'

使用像BeautifulSoup这样的html解析器来解析html个文件。

>>> from bs4 import BeautifulSoup
>>> s = '<a class="rarity-5 set-102 manual-data-link" href="/data/123421" data-id="20886" data-type-id="295636317" >Data</a>'
>>> soup = BeautifulSoup(s)
>>> for i in soup.find_all('a', class_=re.compile('.*manual-data-link')):
    print(i['href'])


/data/123421