【问题标题】:how to extract text from html tags which contain other tags ? regular expression [duplicate]如何从包含其他标签的html标签中提取文本?正则表达式 [重复]
【发布时间】:2016-02-15 13:58:20
【问题描述】:

我有这个 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 );

首先将定位范围 target_text 然后获取&gt;&lt; 之间或它们之外的所有内容。但它没有用?

【问题讨论】:

  • 你真的不能用正则表达式来解析HTML...
  • 根据我的经验,XML 解析器通常是一个很好的正则表达式替代品
  • 我不会说你不能,更重要的是,你应该这样做。使用BeautifulSouplxml'HTMLParser 等。这些更好。相信我

标签: php python html regex


【解决方案1】:

不要使用正则表达式来解析 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'

快!

【讨论】:

  • 感谢您的回答。实际上我没有使用 xpath 查询的经验。并且您的查询不返回“示例文本”
  • @david 我已经更新了。
猜你喜欢
  • 1970-01-01
  • 2018-05-08
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多