在没有外部模块的情况下使用 Python 解析 HTML 文件
Parse HTML file using Python without external module
我正在尝试使用 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>
输出:
我想拿那个特定的块
带有 class "suite" 的 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() 打开一个文件。我可能不正确,但 advise/walk 我通过什么是解决方案来做到这一点。
对于一个元素,您可以尝试使用 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
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 的建议,这是我的解决方案。欢迎任何improvements/suggestions。
我正在尝试使用 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>
输出:
我想拿那个特定的块 带有 class "suite" 的 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() 打开一个文件。我可能不正确,但 advise/walk 我通过什么是解决方案来做到这一点。
对于一个元素,您可以尝试使用 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
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 的建议,这是我的解决方案。欢迎任何improvements/suggestions。