2016-02-03 9 views
1

Я пытаюсь проанализировать html-файл с использованием Python без с использованием любого внешнего модуля. Причина я запуск работы Дженкинс и работаю в некоторых вопросы импорта с LXML и BeautifulSoup (пытались ее решением, и я думаю, что где-то, что я делаю над инженерией, чтобы получить мой сделанный материал)Анализ файла HTML с использованием Python без внешнего модуля

Вход:

<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> 

Выход:

Я хочу, чтобы считать, что конкретный блок из т.р. тега с классом «люкс» (проверка на конец), а затем вытащите значения для нулевого номера, нулевого номера, нулевого номера и пакета 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(). Возможно, я ошибаюсь, но советую/проговори мне, что будет решением для этого.

+1

Как насчет использования stdlib? https://docs.python.org/2/library/htmlparser.html#module-HTMLParser –

+0

Разве это не отдельный модуль? HTMLparser? Раньше у меня не было опыта. Может быть, ты сможешь меня поймать. –

+0

, чтобы получить только один элемент из HTML, вы можете использовать 're' или даже стандартные строковые функции. – furas

ответ

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]) 

EDIT: чтобы получить othere значения с 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 
+0

У меня мало вопросов: 1. Почему решение печатает 98 дважды? 2. Если мне нужно распечатать другие значения из класса = «набор», мне нужно многократно объявлять до и после var. Я пробовал это: r = re.compile (' ') после ваших предложений, но так, как вы делали, звучит правильно. Как получить оставшуюся часть данных из класса класса? –

+0

печатает дважды, потому что есть два решения. сначала с 're' и вторым со строковыми функциями. – furas

+0

Это 'before' и' after' работает только со значением в вашем вопросе.если вам нужны разные значения, вы должны использовать разные 'before' и' after' - или другое значение в 're.search'. – furas

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. Любые улучшения/предложения приветствуются.

+0

Я пытаюсь вызвать такой скрипт python в задании jenkins и запускать ошибку: Файл «file.py», строка 195, в printHeader printCount() Файл «file.py», строка 103, в printCount PASS_COUNT = re.search ('pass number "> (\ d +)', suite_filter.decode ('utf-8')). Group (1) AttributeError: объект« NoneType »не имеет атрибута« group »... i попробовал расшифровать пакет_сообщения, как вы можете видеть в ошибке. Любая подсказка о том, почему я получаю attrerror и как вы разрешаете это? –

 Смежные вопросы

  • Нет связанных вопросов^_^