Форум сайта python.su
Здравствуйте! Помогите новичку, пожалуйста.
Предположим, есть html-код страницы вида:
…
<span> … <\span>
… (здесь могут быть любые другие теги)
<div> … <\div>
<table> … <\table>
…
<span> … <\span>
Мне нужно извлечь таблицу (или таблицы, если их несколько), которые находятся между двумя тегами <span>. Все теги находятся на одном уровне.
Подскажите, пожалуйста, как это сделать?
Офлайн
примерно так:
from lxml import html, etree def get_html(file_name,tag,subtag): tree = html.parse(file_name) nodes = tree.xpath(tag) out = [] for node in nodes: subnode = node.findall(subtag) tmp = [] for sb in subnode: t = sb.text if t: tmp.append(t) if len(tmp): out.append(tmp) return out out = get_html('0000.html','//tr','td') for i in out: print ' '.join(i)
Отредактировано vic57 (Май 20, 2017 16:10:27)
Офлайн
vic57У вас теги вложены друг в друга, а у меня они все на одном уровне. Не смогла придумать, как адаптировать ваш код к моей задаче(
примерно так:
Отредактировано grapefruit_ocean (Май 20, 2017 16:57:17)
Офлайн
каким образом тэги могут быть на одном уровне?
между <table></table> у вас что?
http://tinman.cs.gsu.edu/~raj/8711/sp04/xpath/Output_rus/
Отредактировано vic57 (Май 20, 2017 17:14:05)
Офлайн
vic57<span> и <table> на одном уровне. В идеале мне нужно получить именно объект <table>
каким образом тэги могут быть на одном уровне?между <table></table> у вас что?
Офлайн
out = get_html("0000.html","//table/tr","td")
out = get_html("0000.html","//span/table/tr","td")
Отредактировано vic57 (Май 20, 2017 17:40:40)
Офлайн
Полностью не могу показать, документ большой, но примерно так:
<html> <body> <span1 lang = "az"> ... </span1> … <div> … </div> <table1> … </table1> … <table2> ... </table2> <span2 lang = "en"> … </span2> <table3> ... </table3> </body> </html>
Отредактировано grapefruit_ocean (Май 20, 2017 17:52:22)
Офлайн
понятно. ну путь такой
from lxml import html,etree doc=''' <html> <body> <span lang = "az"> ... </span> <div> … </div> <table><tr><td>1</td></tr></table> <table><tr><td>1</td></tr></table> <span lang = "en"> … </span> <table> ... </table> </body> </html> ''' def get_html(file_name,tag): tree = html.fromstring(file_name) nodes = tree.xpath(tag) for i in nodes: print i.tag,i.attrib,i.sourceline out = get_html(doc,'//body/*')
Отредактировано vic57 (Май 20, 2017 18:31:19)
Офлайн
Справилась таким образом:
text = BeautifulSoup(t, 'lxml') first_el = text.findAll('span', id="Az.C9.99rbaycan_dili")[0].parent # это <span1> (вместо lang - id) other_lang_id = re.compile('.+_dili') # шаблон для поиска отличных id languages = text.findAll('span', id=other_lang_id) # находим все id по этому шаблону for l in languages: # если какое-то из них отлично от первого, то берём тег и прерываем цикл (это будет <span2>) if l['id'] != "Az.C9.99rbaycan_dili": other_lang = l.parent break all_tables = text.findAll('table', rules="all") # находим все таблицы all_tables.extend(text.findAll('table', attrs={"class": "inflection-table"})) tables = [] for child in text.descendants: # используя итератор descendants из BeautifulSoup, спускаемся до <span2> и прерываем цикл как только доходим до него if child != other_lang: for table in all_tables: if child == table: tables.append(child) else: break
Отредактировано grapefruit_ocean (Май 20, 2017 18:31:26)
Офлайн
Ваш вариант выглядит явно проще) Пойду его пробовать
Офлайн