使用Python剥离标签后分配HTML内容(正则表达式解析)

时间:2016-02-07 00:53:44

标签: python html regex parsing html-parsing

我想在剥离标签后分配HTML的内容。这是我最初删除标签的html:

    <tr class="suite">
        <td colspan="2" class="totalLabel">Total</td>

            <td class="zero number">0</td>

            <td class="skipped number">4</td>

            <td class="zero number">0</td>

        <td class="passRate suite">
            0%
          </td>

  </tr>

使用正则表达式剥离标记的方法:

import re
import os

if os.path.isfile(some_html_file):
        with open(some_html_file) as f:
            data = f.read()
before = '<td colspan="2" class="totalLabel">Total</td>'
after  = '</tr>'
start = data.find(before) + len(before)
stop  = data.find(after, start)
d = data[start:stop]

def stripHTMLTags (html):
  text = html
  rules = [
    { r'>\s+' : u'>'},         # remove spaces after a tag opens or closes
    { r'\s+' : u' '},                 # replace consecutive spaces
    { r'[ \t]*<[^<]*?/?>' : u'' },    # remove remaining tags
    { r'^\s+' : u'' }                 # remove spaces at the beginning
  ]

  for rule in rules:
    for (k,v) in rule.items():
      regex = re.compile (k)
      text  = regex.sub (v, text)

  return text

print stripHTMLTags(d)

以下是我得到的输出:0400%

但是,我想将每个HTML td标记的内容分配给变量 和 所以,我预期的最终输出 将是:

A = 0
B = 4
C = 0
D = 0%

分配这些变量的最佳方法是什么?另外,有没有一种方法可以组合我的正则表达式的规则,并具有更简单的正则表达式命令形式?其他使用正则表达式的方法会有所帮助。

3 个答案:

答案 0 :(得分:0)

现在您正在删除所有标记文本。您不应该这样做,因为标记文本为您提供了识别每个值的开始和结束所需的结构。当数字大于一位数时,你会怎么做? 10384003899 - 前面是103或10或1038?

相反,请修改现有框架。写一个可以使用分组来提取单个TD元素值的正则表达式。就像是 <td>(.*)</td>(除非我保证不起作用)。然后,您可以遍历您的字符串,一次又一次地匹配该模式,直到它失败,将每个匹配追加到列表中。完成后,您将获得一个值列表,然后您可以随意操作这些值。

答案 1 :(得分:0)

要关注评论,为了完整起见,您可以使用BeautifulSoup HTML parser来获取总数。

我们的想法是找到td类的totalLabel元素并获取next td siblings

from bs4 import BeautifulSoup   

data = """
<tr class="suite">
    <td colspan="2" class="totalLabel">Total</td>
    <td class="zero number">0</td>
    <td class="skipped number">4</td>
    <td class="zero number">0</td>

    <td class="passRate suite">
        0%
    </td>
</tr>
"""

soup = BeautifulSoup(data, "html.parser")

totals = [td.get_text(strip=True) 
          for td in soup.find("td", class_="totalLabel").find_next_siblings("td")]
print(totals)

打印:

['0', '4', '0', '0%']

答案 2 :(得分:0)

答案不完整(需要最后一步的帮助)

my_html_file内容:

A = 0
B = 4
C = 0
D = 0%

这让我:

{{1}}

如何将r.sub(r&#39; \ 2 \ n&#39;,m)的输出分配给变量,例如:

{{1}}

以上是我的需要。