2014-02-02 4 views
1

Я думал, что lxml будет лучше для этой цели, но я открыт для лучших предложений. В основном я хочу, чтобы извлечь значения из таблицы, которая выглядит следующим - (что уже в переменном питоне):python извлекает значения из таблицы html

<thead><tr> .... </tr></thead> 
<tbody> 
<tr><td>col1val1</td><td>col2val1</td></tr> 
<tr><td>col1val2</td><td>col2val2</td></tr> 
<tr><td>col1val3</td><td>col2val3</td></tr> 
</tbody> 

Теперь поток, а и TBODY тегов находятся в пути и не нужны, так как-то мне нужно сначала отрезать эти теги, а затем пропустить все три строки по одной строке за раз. Мне нужно выполнить операцию (вставить в базу данных) с каждой полной строкой данных, прежде чем переходить к следующей строке.

Я думаю, что эти первые два ответа не работают, потому что таблица html находится в формате объекта Юникод.

+1

'lxml' кажется хорошим выбором. – lanzz

ответ

0

пример использования lxml.html:

from lxml import html 

tree = html.fromstring('<html>Your HTML code</html>') 
rows = tree.xpath('//table/tr') #update your table XPath here 
records = [] 
for row in rows: 
    cells = [c for c in row.xpath('./td/text()') if c.strip()] 
    # do something with cells content 
0

Использование регулярных выражений:

import re 

s = """<thead><tr> .... </tr></thead> 
<tbody> 
<tr><td>col1val1</td><td>col2val1</td></tr> 
<tr><td>col1val2</td><td>col2val2</td></tr> 
<tr><td>col1val3</td><td>col2val3</td></tr> 
</tbody> """ 

lines = s.splitlines() 
for line in lines[2:]: 
    #print line 
    match = re.findall("<td>(.+?)</td>", line) 
    for m in match: 
     print m 
Смежные вопросы