如何从包含其他标签的html标签中提取文本?正则表达式


how to extract text from html tags which contain other tags ? regular expression

我有这个html文本:

<span id="target_text"> 
         sample text
         <span class="red"> word1 </span>
         <span class="green"> <b> word2 </b> word3 </span>
         <b> word4 </b>
         <span> word5 </span>
         <b> word6 </b>
         <a class="itlink" href="http:www.example.com" > Details </a>
</span>

我需要在id为target_text:的跨度内获取显示的文本

sample text word1 word2 word3 word4 word5 word6 Details

注意:我不知道targettext中有多少b或span标记子项。

我试过这个表达:

preg_match_all ( "%target_text.*?>(.*?<.*?>.*?<.*?>.*?)</span>%s", $html_text, $out, PREG_PATTERN_ORDER );

它将首先定位跨度target_ text,然后获取CCD_。但没用?

不要使用正则表达式解析HTML。曾经

了解什么是xpath,你会过得更好(xpath可以用在许多语言中)。Python内置了eTree,这对您的示例来说很好,但lxml是一个更好的库(具有基本兼容的接口)。

In [1]: import lxml.html
In [2]: html = lxml.html.fromstring("""<span id="target_text">
   ...:          sample text
   ...:          <span class="red"> word1 </span>
   ...:          <span class="green"> <b> word2 </b> word3 </span>
   ...:          <b> word4 </b>
   ...:          <span> word5 </span>
   ...:          <b> word6 </b>
   ...:          <a class="itlink" href="http:www.example.com" > Details </a>
   ...: </span>""")
In [3]: html.xpath('//span[@id="target_text"]')[0].text_content()
Out[3]:' 'n         sample text'n          word1 'n           word2  word3 'n          word4 'n          word5 'n          word6 'n          Details 'n'

您需要稍微清理一下结果文本,以去除无用的额外空白。

In [9]: content = html.xpath('//span[@id="target_text"]')[0].text_content()
In [10]: import re
In [11]: re.sub(''s+', ' ', content).strip()
Out[11]: 'sample text word1 word2 word3 word4 word5 word6 Details'

普雷斯托!