[英]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) “ONE LAST KICK”"
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) “ONE LAST KICK”']
這是一個很好的正則表達式,可以找到組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.