Как только я определил начальную и конечную части раздела HTML-документа, используя lxml, как мне получить все между ними - PullRequest
2 голосов
/ 17 августа 2010

Я работаю с некоторыми HTML-файлами. Я пытаюсь найти способ последовательно добраться до некоторого текста, который существует в документах. Я знаю, что раздел, который я хочу, начинается с некоторых жирных слов, и я знаю, что раздел заканчивается другими жирными словами.

bolded_item=atree.cssselect('b')

myKeys=[item for item in bolded_items if item.text if 'KEY' in item.text]

поэтому myKeys - это список, членами которого являются элементы из atree, в частности, элементы, которые имеют жирный текст и имеют слово «KEY» в тексте.

Теперь я хочу идентифицировать все части дерева между любыми двумя элементами в myKeys. Я хочу иметь возможность манипулировать ими различными способами. Я играл с getparent, getchildren getnext и всеми другими методами, которые выглядели вероятными после запуска dir (myKeys [0]), но я не прогрессировал.

Любые предложения будут оценены

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Я бы предложил использовать SAX для этой задачи.

Основные документы доступны на http://lxml.de/sax.html#producing-sax-events-from-an-elementtree-or-element

Ваш обработчик должен потреблять события без каких-либо действий, пока он не получит необходимый жирный элемент,и затем он записывает события в новый буфер / дерево / что угодно, пока не получит завершающий жирный элемент.

0 голосов
/ 19 августа 2010

В духе ТАК я понял, что я считаю лучшим ответом, и собираюсь опубликовать его сам.

import lxml
from lxml import html
testFile=open(r'c:\temp\testlxml.htm').read()
aTree=html.fromstring(testFile)
bolds=aTree.cssselect('b')
theTitles=[item.text for item in bolds if item.text if 'KEY' in item.text]
theBoldKeys=[item for item in bolds if item.text if 'KEY' in item.text]
theFullList=[]
for e in aTree.iter():
    theFullList.append(e)

for numb,item in enumerate(theFullList):
    if item==theBoldItems[0]:
        first=numb
    if item==theBoldItems[1]:
        second=numb
theText=[]
for item in theFullList[first:second]:
    if item.text:
        theText.append(item.text)
    if item.tail:
       theText.append(item.tail)

aString=' '.join(theText)

Немного объяснений.

Моя цель - применить некоторую логику к выделенным частям документов, поскольку те выделенные жирным шрифтом разделы, в которых есть слово KEY, определяют различные разделы документа. TheTitles - это список элементов, выделенных полужирным шрифтом и включающих слово «KEY». Исходя из моих конкретных потребностей, мне может понадобиться весь текст между любыми двумя элементами из заголовков, я могу создавать тесты и необходимую логику для выбора элементов из заголовков.

theBoldItems - это список фактических элементов для любых i theTitles [i] == theBoldItems [i] .text

далее я получаю theFullList, который является всеми элементами htm в дереве. Поскольку LXML строит дерево по порядку, я знаю, что хочу захватить все элементы theBoldItems [i] и theBoldItems [i + 1]. И хорошо то, что способ, с помощью которого Python построен, тест настолько прост.

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

...