模式如下
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>
答案 0 :(得分:4)
你有三个问题。
1)在这种情况下,您不应该致电re.escape
。 re.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