【问题标题】:Regex to extract names from HTML正则表达式从 HTML 中提取名称
【发布时间】:2020-03-28 10:01:32
【问题描述】:

下面有两段代码,我想从中提取名称。

代码:

 ;"><strong>DeanSkyShadow</strong>
 ;"><strong><em>Xavier</em></strong>

正则表达式应该提取名称 DeanSkyShadowXavier。我当前的正则表达式:

(?<=(;"><strong><em>)|(;"><strong>))[\s\S]+?(?=(</em></strong>)|(</strong>))

如果代码中没有 em 标签,则正确抓取名称;如果有,那么它也会抓取开始的 em 标签,如下所示:&lt;em&gt;Xavier。我该如何解决?

【问题讨论】:

  • 为什么在 HTML 解析器更适合的地方使用正则表达式?
  • 好吧,因为我不知道什么是 HTML 解析器,你能解释一下吗?我使用 urllib2 首先读取特定页面的 html,然后使用正则表达式提取名称。

标签: python html regex


【解决方案1】:

匹配任何不是 &lt; 字符的东西;你也不能使用可变宽度的look-behind,所以你的版本根本不起作用。改用非捕获模式

(?:;"><strong>(?:<em>)?)([^<]+?)(?=(?:</em>)?</strong>)

演示:

>>> import re
>>> sample = '''\
...  ;"><strong>DeanSkyShadow</strong>
...  ;"><strong><em>Xavier</em></strong>
... '''
>>> re.findall(r'(?:;"><strong>(?:<em>)?)([^<]+?)(?=(?:</em>)?</strong>)', sample)
['DeanSkyShadow', 'Xavier']

更好的 解决方案是改用 HTML 解析器。我可以推荐BeautifulSoup

from bs4 import BeautifulSoup

soup = BeautifulSoup(htmltext)

for strong in soup.find_all('strong'):
    print strong.text

【讨论】:

  • 不错,确实是一个更好的解决方案。
  • 感谢正则表达式更新,它现在可以工作了:) 之前很困惑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2015-07-08
  • 1970-01-01
相关资源
最近更新 更多