RegEx用于匹配HTML的特定元素

时间:2019-05-09 17:52:07

标签: python regex regex-lookarounds regex-group findall

我正在研究一个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。

我如何获得理想的结果?

2 个答案:

答案 0 :(得分:2)

使用BeautifulSoup之类的支持HTML的解决方案可以处理更多情况,但是如果您确定HTML始终符合您的示例,则可以使用粗略的正则表达式匹配,例如:

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

答案 1 :(得分:2)

这是一个很好的正则表达式,可以找到组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