【问题标题】:Assign HTML content after stripping tags using Python (regex parse)使用 Python 剥离标签后分配 HTML 内容(正则表达式解析)
【发布时间】:2016-05-16 20:46:40
【问题描述】:

我想在剥离标签后分配 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%

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

【问题讨论】:

  • 如果你想利用 HTML 结构,不要剥离 HTML。使用 HTML 解析库解析它。
  • 我还在学习如何解析事物?有没有办法可以指导我如何使用 HTML 解析库来解决像我这样的问题?
  • @BrenBarn 使用正则表达式对我来说很重要 - 因为我将在 jenkins 上运行这样的脚本并使用外部依赖项(BeautifulSoup,lxml)将涉及影响我所有从属机器并获得它的开销在这种情况下,使用正则表达式会很有帮助。
  • @BrenBarn:根据我想要实现的目标,正则表达式会非常有帮助 - 请参阅上面的我的 cmets

标签: python html regex parsing html-parsing


【解决方案1】:

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

改为修改您现有的框架。为自己编写一个正则表达式,它可以使用 grouping 来提取单个 TD 元素的值。就像是 &lt;td&gt;(.*)&lt;/td&gt; (除了我向你保证那行不通)。然后你可以遍历你的字符串,一次又一次地匹配该模式直到它失败,将每个匹配项附加到一个列表中。完成后,您将获得一个值列表,然后您可以随心所欲地对其进行操作。

【讨论】:

  • 我是 regex 的新手,也许你可以告诉我我的一个例子?
  • 我给出的例子是匹配组的一个很好的例子。但它不允许在开始标签中包含额外的字段(如class="...")。我看到您在原始代码中使用正则表达式代码,所以我相信您可以弄清楚如何做到这一点。
  • ...有问题的方法后跟.... d = data[start:stop] m = re.sub(r'\s+', '', d) r = re.compile ('(.*?)') k = r.sub(r'\2\n', m) print k........ ......这让我在所有新的四行中达到 0、4、0、0%(我正在使用 \n)..现在的问题是我如何分配 r.sub(r'\ 2\n', m)...转为A = 0, B = 4, C = 0, D = 0%等变量...
  • 如果你得到一个成功的re.match(),你可以使用.group(n)来提取第n组的值。有关示例,请参阅the docs on re
【解决方案2】:

为了关注 cmets 并为了完整起见,这里是您如何使用 BeautifulSoup HTML parser 获取总数的方法。

想法是找到totalLabel类的td元素并获得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%']

【讨论】:

  • alecxe - 谢谢,这对我的学习非常有用,但是我想通过正则表达式来实现这一点(推荐使用 BeautifulSoup 和 lxml)......如果你看到我的 cmets 对奥斯汀的回应.. .我快到了..我通过 d = data[start:stop] m = re.sub(r'\s+', '', d) r = re.compile 得到输出 0, 4, 0, 0% ('(.*?)') k = r.sub(r'\2\n', m) print k...我该如何分配这个r.sub(r'\2\n', m)...的输出到变量A = 0, B = 4, C = 0, D = 0%...
【解决方案3】:

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

my_html_file 内容:

<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(my_html_file):
        with open(my_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]
m = re.sub(r'\s+', '', d)
r = re.compile('<tdclass="(.*?)">(.*?)</td>')
k = r.sub(r'\2\n', m)
print k

这让我:

0
4
0
0%

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

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

以上是我需要的。

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2013-07-23
    • 2014-06-26
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多