【问题标题】:Parse HTML file using Python without external module在没有外部模块的情况下使用 Python 解析 HTML 文件
【发布时间】:2016-05-12 01:03:01
【问题描述】:

我正在尝试使用 Python 解析 html 文件 使用任何外部模块。原因是我在触发 詹金斯的工作并遇到了一些导入问题 lxml 和 BeautifulSoup (尝试解决它,我认为 我在某处做工程以完成我的工作)

输入

    <tr class="test">
    <td class="test">
      <a href="a.html">BA</a>
    </td>
    <td class="duration">
      0.000s
    </td>

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

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

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

    <td class="passRate">
            N/A
          </td>
  </tr>

  <tr class="test">
    <td class="test">
      <a href="o.html">Aa</a>
    </td>
    <td class="duration">
      0.000s
    </td>

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

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

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

    <td class="passRate">
            N/A
          </td>
  </tr>

  <tr class="test">
    <td class="test">
      <a href="g.html">VideoAds</a>
    </td>
    <td class="duration">
      0.390s
    </td>

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

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

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

    <td class="passRate">
            N/A
          </td>
  </tr>

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

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

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

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

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

  </tr>

输出

我想占用那个特定的块 带有“套件”类的 tr 标签(最后检查),然后拉 零号、零号、零号的值 和 passRate 套件。最后,打印值。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

例如。零数 = 271 ...

通过率 = 98%

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 这是我对 lxml 的尝试:

tree = parse(HTML_FILE)
tds = tree.xpath("//tr[@class='suite']//td/text()")
val = map(str.strip, tds)

这在本地可行,但我真的想做点什么 没有任何外部依赖。我应该使用 strip() 还是 使用 os.path.isFile() 打开一个文件。我可能不正确,但建议/引导我完成此操作的解决方案。

【问题讨论】:

  • 又不是一个单独的模块吗? HTML解析器?我以前没有任何经验。也许你可以带我走。
  • 要从 HTML 中只获取一个元素,您可以使用 re 甚至标准字符串函数。
  • 我可以,但问题是我需要用 class= "suite" 取出那个 tr 块,然后获取值。您能想到的任何替代/想法?
  • @furas : 你能告诉我你是怎么做的吗?

标签: python jenkins attributeerror jenkins-cli html-parser


【解决方案1】:

对于一个元素,您可以尝试使用re 模块甚至字符串函数。

data = '''<tr class="test">
<td class="test">
<a href="no.html">track</a></td>
<td class="duration">0.390s</td>
<td class="zero number">0</td>
<td class="zero number">0</td>
<td class="zero number">0</td>
<td class="passRate">N/A</td></tr>

<tr class="suite">
<td colspan="2" class="totalLabel">Total</td>
<td class="passed number">271</td>
<td class="zero number">0</td>
<td class="failed number">3</td>
<td class="passRate suite">98%</td>
</tr>'''

# re module

import re

print(re.search('suite">(\d+)%', data).group(1))

# string functions

before = 'passRate suite">'
after  = '%'
start = data.find(before) + len(before)
stop  = data.find(after, start)

print(data[start:stop])

编辑:使用re获取其他值

import re

print('passed:', re.search('passed number">(\d+)', data).group(1))
print('zero:', re.search('zero number">(\d+)', data).group(1))
print('failed:', re.search('zero number">(\d+)', data).group(1))
print('Rate:', re.search('suite">(\d+)', data).group(1))

passed: 271
zero: 0
failed: 0
Rate: 98

【讨论】:

  • 我有几个问题: 1. 为什么解决方案打印 98 两次? 2.如果我必须从class=“suite”打印其他值,是否需要在var's之前和之后重复声明......我试过这个:r = re.compile('') 根据您的建议,但您的做法听起来是正确的。如何从套件类中获取其余数据?
  • 它打印两次,因为有两种解决方案。首先是re,其次是字符串函数。
  • beforeafter 仅适用于您的问题中的价值。如果您需要不同的值,则必须使用不同的 beforeafter - 或 re.search 中的不同值。
  • 谢谢..我对正则表达式不太熟悉...您如何将 re.search 应用于传递的数字、零数字和失败的数字以在该套件中打印 271、0 和 3 的值上课?
  • 见答案中的例子。如果文件中有多个passed numberzero numberfailed number,您将获得更多结果。
【解决方案2】:
import re

f = open(HTML_FILE)
data = f.read()
before = '<td colspan="2" class="totalLabel">Total</td>'
after  = '%<'
start = data.find(before) + len(before)
stop  = data.find(after, start)

suite_filter = data[start:stop].strip()

RATE_PASS = re.search('suite">[ \n]+(\d+)', suite_filter).group(1)
PASS_COUNT = re.search('passed number">(\d+)', suite_filter).group(1)
SKIPPED_COUNT = re.search('zero number">(\d+)', suite_filter).group(1)

FAIL_COUNT = re.search('failed number">(\d+)', suite_filter).group(1)

TESTS_TOTAL = int(PASS_COUNT) + int(SKIPPED_COUNT) + int(FAIL_COUNT)

print RATE_PASS, PASS_COUNT, SKIPPED_COUNT, TESTS_TOTAL

根据@furas 的建议,这是我的解决方案。欢迎任何改进/建议。

【讨论】:

  • 我试图在 jenkins 作业上触发这样的 python 脚本并遇到错误:文件“file.py”,第 195 行,在 printHeader printCount() 文件“file.py”,第 103 行, 在 printCount PASS_COUNT = re.search('passed number">(\d+)', suite_filter.decode('utf-8')).group(1) AttributeError: 'NoneType' object has no attribute 'group' .. .我尝试解码suite_filter,正如你在错误中看到的那样。关于我为什么会出现attrerror以及你如何解决这个问题的任何线索?
猜你喜欢
相关资源
最近更新 更多
热门标签