我有这个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
注意:我不知道target_text中有多少b或span标记子项。
我尝试了这个表达式:
preg_match_all ( "%target_text.*?>(.*?<.*?>.*?<.*?>.*?)</span>%s", $html_text, $out, PREG_PATTERN_ORDER );
首先会找到span target_text然后获取><
之间或者它们之外的所有内容。但它没有用?
答案 0 :(得分:2)
不要使用正则表达式来解析HTML。如初。
了解xpaths是什么,你会好多了(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'
的Presto!