[英]Regex matching specific HTML string with Python
模式如下
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
問題是,即使我確保它與http://pythex.org/一起正常運行,匹配也始終為“無”。 我懷疑我沒有正確編譯/轉義模式。
測試字符串
<a class="rarity-5 set-102 manual-data-link" href="/data/123421" data-id="20886" data-type-id="295636317" >Data</a>
你有三個問題。
1)在這種情況下,您不應調用re.escape
。 re.escape
防止特殊字符(例如.
, *
或?
)具有特殊含義。 您希望它們在這里具有特殊含義。
2)您應該使用re.search
,而不是re.match
從字符串開頭開始的re.match
匹配; 您想在字符串中的任何位置找到匹配項。
3) 您不應該使用正則表達式解析HTML 。 使用專為這項工作設計的工具,例如BeautifulSoup。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.