【问题标题】:return html tags in the html text using re使用 re 在 html 文本中返回 html 标签
【发布时间】:2019-08-03 10:51:51
【问题描述】:

我有 html 文本,我只想确定文本中可用的 html 标签。

html_text = '<p class="gmail-m3464245979397595798gmail-m6143070745855285966gmail-m-3072962113628903492gmail-m-7999079541169053160wordsection1" style="margin:0in;margin-bottom:.0001pt">Position Title: Onsite Client Services Associate<br /> Duration: 7 months<br /> Location: Tempe, AZ 85282<br /> &nbsp;<br /> <b><u>Roles and responsibilities</u></b><o:p></o:p></p> <p class="gmail-m3464245979397595798gmail-m6143070745855285966gmail-m-3072962113628903492gmail-m-7999079541169053160wordsection1" style="margin-top:5.0pt;margin-right:0in;margin-bottom:0in;margin-left:.25in; margin-bottom:.0001pt"><span style="font-family:Symbol">&middot;</span><span style="font-size:7.0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Primary function during peak season (July-December) will be an onsite presence at our large client in the Phoenix area. <o:p></o:p></p>'

作为第一步,我从每个 html 标签的文本中解析每个标签 喜欢html_text.find('&lt;/p&gt;')。由于通过检查每个标签来解析很长,我试图使用正则表达式

re.findall(r'\<\/.>', html_text)

上面的输出是['&lt;/p&gt;', '&lt;/b&gt;', '&lt;/u&gt;']。但我希望输出为['&lt;/p&gt;','&lt;/span&gt;', '&lt;br /&gt;', '&lt;/b&gt;', '&lt;/u&gt;']。所以如果我修改

re.findall(r'\<\/.*>', html_text) 

假设我可以得到&lt;/span&gt;,我得到了整个文本。

['</u></b><o:p></o:p></p> <p class="gmail-m3464245979397595798gmail-m6143070745855285966gmail-m-3072962113628903492gmail-m-7999079541169053160wordsection1" style="margin-top:5.0pt;margin-right:0in;margin-bottom:0in;margin-left:.25in; margin-bottom:.0001pt"><span style="font-family:Symbol">&middot;</span><span style="font-size:7.0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Primary function during peak season (July-December) will be an onsite presence at our large client in the Phoenix area. <o:p></o:p></p>']

有没有办法可以将所有标签的表达式写成一个表达式,或者我应该为每个标签写条件检查?在上面我无法确定&lt;br /&gt;

【问题讨论】:

  • 试试re.findall(r'&lt;/?(\w+)[^&gt;]*&gt;', html_text)
  • 感谢@WiktorStribiżew 的精彩回答,w+ 对表达式做了什么?

标签: html regex python-3.x


【解决方案1】:

终于经过一些小道,我找到了自己的答案,如果它对某人有帮助,就发布它。它将确定所有的标签,做一些清理将确定标签。

re.findall(re.compile("<.*?>"), html_text)

输出是

['<p class="gmail-m3464245979397595798gmail-m6143070745855285966gmail-m-3072962113628903492gmail-m-7999079541169053160wordsection1" style="margin:0in;margin-bottom:.0001pt">', '<br />', '<br />', '<br />', '<br />', '<b>', '<u>', '</u>', '</b>', '<o:p>', '</o:p>', '</p>', '<p class="gmail-m3464245979397595798gmail-m6143070745855285966gmail-m-3072962113628903492gmail-m-7999079541169053160wordsection1" style="margin-top:5.0pt;margin-right:0in;margin-bottom:0in;margin-left:.25in; margin-bottom:.0001pt">', '<span style="font-family:Symbol">', '</span>', '<span style="font-size:7.0pt">', '</span>', '<o:p>', '</o:p>', '</p>']

【讨论】:

  • 对于负面标记,请告诉我为什么它被标记为负面。
  • 您的解决方案与您在问题中提到的不匹配。您只想匹配 ['

    ','', '
    ', '', '']。

【解决方案2】:

据我所知,仅使用正则表达式无法完全实现您想要做的事情。

通常,在 HTML 标记中,开始标记内有属性。例如- &lt;span class="text"&gt;Some Text &lt;/span&gt; 在开头 &lt;span 和结尾 &gt; 之间有 class="text"

因此,如果您只想从&lt;span class="text"&gt;Some Text &lt;/span&gt; 匹配&lt;span&gt;,则必须先匹配&lt;span,然后以某种方式跳过class="text" 并再次匹配&gt;。这对于正则表达式是不可能的,因为正则表达式只能一个接一个地匹配字符。


我想到的一个解决方案是,您可以使用这个正则表达式(&lt;[^\/\s]+)([^&gt;]+)&gt;。这将匹配&lt;span class="text"&gt;Some Text &lt;/span&gt; 并返回&lt;span。然后,您可以在使用字符串连接之后添加&gt;

正则解释-

谢谢。

【讨论】:

  • 可以用正则表达式回答,我发布了答案,看看吧。
  • @Raady 不,您在问题中提到您只想匹配 ['

    ','', '
    ', '', ' ']。但是,您的正则表达式将匹配 &lt;p&gt; 之间的所有内容。这有什么相似之处?

  • 一旦你找出所有的标签,通过忽略"req_tag">很容易确定req_tags
  • 你没有在问题中提到这一点,是吗?我知道这很容易。但是你必须清楚你在寻找什么。
猜你喜欢
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多