使用Python解析HTML文件而不使用外部模块

时间:2016-02-03 01:11:06

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

我正在尝试使用Python解析html文件 使用任何外部模块。原因是我在触发 jenkins工作并遇到一些导入问题 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 +标签与#34;套件&#34; (检查结束)然后拉 零号,零号,零号的值 和passRate套件。最后,打印值。

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

EG。零数= 271 ...

通过率= 98%

~~~~~~~~~~~~~~~~~~~~~~~~~~ 这是我尝试使用lxml:

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

这在当地有效,但我真的想做点什么 没有任何外部依赖。我应该使用strip()或 使用os.path.isFile()打开一个文件。我可能不正确,但建议/告诉我解决这个问题的方法。

2 个答案:

答案 0 :(得分:0)

对于一个元素,您可以尝试使用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 :(得分:0)

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的建议,这是我的解决方案。欢迎任何改进/建议。