我正在研究一个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。
我如何获得理想的结果?
答案 0 :(得分:2)
使用BeautifulSoup
之类的支持HTML的解决方案可以处理更多情况,但是如果您确定HTML始终符合您的示例,则可以使用粗略的正则表达式匹配,例如:
re.findall('<a.*? title=\"(.*?)\"', html, re.DOTALL)
# ['CHOCOLATE STARFISH (AUS) “ONE LAST KICK”']
答案 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