簡體   English   中英

RegEx用於匹配HTML的特定元素

[英]RegEx for matching specific element of HTML

我正在研究一個Python代碼,該代碼從網站提取特定元素並將其打印在通過tkinter模塊實現的GUI上。 要從網頁中提取特定元素,需要使用我目前不熟悉的正則表達式,盡管我能夠獲得各種元素,但我仍然很難提取某些元素。 下面給出一個這樣的例子。

<div class="updated published time-details"><a class="url" 
    href="https://thetriffid.com.au/gig/chocolate-starfish-one-last-kick/" 
    title="CHOCOLATE STARFISH (AUS) &#8220;ONE LAST KICK&#8221;" 
    rel="bookmark"><span class="tribe-event-date-start">Sat Aug 3 @ 8:00 
    pm</span>
    </a>
</div>

這是HTML代碼的一部分,我只需要其中的標題即“巧克力海星(AUS)和最后一腳”。 我使用的是findall方法,不允許使用其他外部庫,例如Beautiful Soup。 因此,我們必須使用findall,finditer,MULTILINE和DOTALL。

我如何獲得理想的結果?

使用像BeautifulSoup這樣的可BeautifulSoup HTML的解決方案可以處理更多情況,但是如果您確定HTML將始終符合您的示例,則可以使用大致的正則表達式匹配,例如:

re.findall('<a.*? title=\"(.*?)\"', html, re.DOTALL)
# ['CHOCOLATE STARFISH (AUS) &#8220;ONE LAST KICK&#8221;']

這是一個很好的正則表達式,可以找到組2中具有'title'屬性的'a'標簽。

r"(?si)<a(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?\stitle\s*=\s*(['\"])(.*?)\1)(?:\".*?\"|'.*?'|[^>]*?)+>"

可讀版本

 (?si)

 <a
 (?=
      (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
      \s title \s* = \s* 
      ( ['"] )                      # (1)
      ( .*? )                       # (2)
      \1 
 )
 (?: " .*? " | ' .*? ' | [^>]*? )+
 >

使用大型網頁(cnn.com)和300次迭代進行基准測試

Regex1:   (?si)<a(?=(?:[^>"']|"[^"]*"|'[^']*')*?\stitle\s*=\s*(['"])(.*?)\1)(?:".*?"|'.*?'|[^>]*?)+>
Options:  < none >
Completed iterations:   300  /  300     ( x 1 )
Matches found per iteration:   285
Elapsed Time:    3.26 s,   3262.08 ms,   3262081 µs
Matches per sec:   26,210

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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