2015-02-19 2 views
1

Я относительный новичок на Python. У меня есть html-страница со таблицей, подобной приведенной ниже. То, что я хотел бы анализировать и обрабатывать эти данные более аккуратным образом более питоническим способом.Есть ли еще pythonic способ разбора моей таблицы с помощью Beautifulsoup

<table border="1"> 
    <tr><td><b>Test Results</b></td><td><b>Log File</b></td><td><b>Passes</b></td><td><b>Fails</b></td></tr> 
    <tr><td><b>Test suite A</b></td><td><a href="A_logs.html">Logs</a></td><td><b>10</b></td><td><b>0</b></td></tr> 
    <tr><td><b>Test suite B</b></td><td><a href="B_logs.html">Logs</a></td><td><b>20</b></td><td><b>0</b></td></tr> 
    <tr><td><b>Test suite C</b></td><td><a href="C_logs.html">Logs</a></td><td><b>15</b></td><td><b>0</b></td></tr> 
</table> 

Использование BeautifulSoup Я проанализировал таблицу.

results_table = tables[0] # This will get the first table on the page. 
table_rows = my_table.findChildren(['th','tr']) 

for i in table_rows: 
    text = str(i) 
    print("All rows:: {0}\n".format(text)) 
    if "Test suite A" in text: 
     print("Test Suite: {0}".format(text)) 
     # strip out html characters 
     list = str(BeautifulSoup(text).findAll(text = True)) 
     # strip out any further stray characters such as [,] 
     list = re.sub("[\'\[\]]", "", list) 
     list = list.split(',') # split my list entries by comma 
     print("Test: {0}".format(str(list[0]))) 
     print("Logs: {0}".format(str(list[1]))) 
     print("Pass: {0}".format(str(list[3]))) 
     print("Fail: {0}".format(str(list[4]))) 

Это мой код, который делает все, что я хочу. Мне просто интересно, есть ли более питонический способ сделать это. Игнорирование операторов печати, поскольку я планирую поместить это в свой собственный метод, проходящий в таблице результатов, и возвращать пропуск, терпеть неудачу, регистрировать, тестировать.

Так ..

def parseHtml(results_table) 
    # split out all rows in my table into a list 
    table_rows = my_table.findChildren(['th','tr']) 
    for i in table_rows: 
     text = str(i) 
     if "Test suite A" in text: 
      # strip out html characters 
      list = str(BeautifulSoup(text).findAll(text = True)) 
      # strip out any further stray characters such as [,] 
      list = re.sub("[\'\[\]]", "", list) 
      # split my list entries by comma 
      list = list.split(',') 
    return (list[0],list[1],list[3],list[4]) 
+0

начало использования, не используя список как имя переменной, также почему вы выбрали find_all как str? –

+0

Что именно вы хотите извлечь? –

+0

Чтобы начать с, не называйте переменную 'list'. –

ответ

1
html="""<table border="1"> 
    <tr><td><b>Test Results</b></td><td><b>Log File</b></td><td><b>Passes</b></td><td><b>Fails</b></td></tr> 
    <tr><td><b>Test suite A</b></td><td><a href="A_logs.html">Logs</a></td><td><b>10</b></td><td><b>0</b></td></tr> 
    <tr><td><b>Test suite B</b></td><td><a href="B_logs.html">Logs</a></td><td><b>20</b></td><td><b>0</b></td></tr> 
    <tr><td><b>Test suite C</b></td><td><a href="C_logs.html">Logs</a></td><td><b>15</b></td><td><b>0</b></td></tr> 
</table>""" 


from bs4 import BeautifulSoup 

soup = BeautifulSoup(html) 
data = soup.find_all("b") # this will be your table 

# ignore Test Result etc.. and get Test suite A ... from each row 
data = (data[4:][i:i+3] for i in range(0, len(data[4:]),3)) 
# get all log file names 
logs = iter(x["href"] for x in soup.find_all("a",href=True)) 

# unpack each subelement and print the tag text 
for a, b, c in data: 
    print("Test: {}, Log: {}, Pass: {}, Fail: {}".format(a.text ,next(logs),b.text, c.text)) 


Test: Test suite A, Log: A_logs.html, Pass: 10, Fail: 0 
Test: Test suite B, Log: B_logs.html, Pass: 20, Fail: 0 
Test: Test suite C, Log: C_logs.html, Pass: 15, Fail: 0 

Не используйте list в качестве переменной name, поскольку он тень python list, если вы хотите, чтобы элементы из ваших подписок с ваших вызовов find_all либо перебирали, либо индексировали, не используйте re.

-1

В такой ситуации я бы, как правило перебрать 'тр', а затем 'тд'

bs_table = BeautifulSoup(my_table) 
ls_rows = [] 
for ls_tr in bs_table.findAll('tr'): 
    ls_rows.append([td_bloc.text for td_bloc in ls_tr.findAll('td')]) 

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

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