簡體   English   中英

正則表達式將特定的HTML字符串與Python匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM