Объединение слов в Xml

В следующем xml:

<w:body>
    <w:p w:rsidR="00912B30" w:rsidRPr="00912B30" w:rsidRDefault="00912B30" w:rsidP="00912B30">
        <w:pPr>
            <w:autoSpaceDE w:val="0"/>
            <w:autoSpaceDN w:val="0"/>
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
        </w:pPr>
        <w:r w:rsidRPr="00912B30">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
            <w:t xml:space="preserve">Considering those situations, after 1970 The </w:t>
        </w:r>
        <w:r w:rsidRPr="00E155EC">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:strike/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
            <w:t>Agricultural Land Law</w:t>
        </w:r>
        <w:r w:rsidRPr="00912B30">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
            <w:t xml:space="preserve"> of 1952 was modified and changed the principle to permit renting and lending agricultural land. The way of thinking was as follows. If it was difficult to widen farmers’ size by buying agricultural land, expanding the size by renting would be possible. After that some positive framework to promote renting and lending agricultural land. For example, The </w:t>
        </w:r>
        <w:r w:rsidRPr="00E155EC">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:strike/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
            <w:t>Agricultural Land Use Promotion Project</w:t>
        </w:r>
        <w:r w:rsidRPr="00912B30">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
            <w:t xml:space="preserve"> had started in 1975 and The </w:t>
        </w:r>
        <w:r w:rsidRPr="00E155EC">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:strike/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
            <w:t>Agricultural Land Use Promotion Law</w:t>
        </w:r>
        <w:r w:rsidRPr="00912B30">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
            <w:t xml:space="preserve"> was established in 1980. Actually after that, area of agricultural land by transfer of ownership of owned agricultural land with compensation had been more than the area by transfer of rights for </w:t>
        </w:r>
        <w:r w:rsidRPr="00912B30">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                <w:snapToGrid w:val="0"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
            </w:rPr>
            <w:lastRenderedPageBreak/>
            <w:t>lease.</w:t>
        </w:r>
    </w:p>
</w:body>  

Мне нужно извлечь весь текст с тегом <w:strike>, где

w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'

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

Мой подход:

 text = ""  #initialize empty string where all words will be stored
    source = etree.parse(doc_xml)
    for p in source.findall('.//'+w1+'p'): #iterate over every p tag
        text+= " "      # add a space to separate words in successive paragraphs
        for b in p.findall('.//{%(ns)s}strike/../..//{%(ns)s}t' %{'ns':w}):
            text+=''.join(b.text) #joins all strike text and appends to empty string

Вывод:

text =" Agricultural Land LawAgricultural Land Use Promotion ProjectAgricultural Land Use Promotion Law"

Ожидаемый результат:

text = " Agricultural Land Law Agricultural Land Use Promotion Project Agricultural Land Use Promotion Law" 

Грубое исправление: замените последнюю строку кода на:

text+=" " +''.join(b.text)

Он исправляет вышеуказанное, но во многих случаях одно слово попадает под 2 экземпляра исключения, в результате чего грубое исправление может выводить "he lp" вместо "help" . Это немного сложно, и я подумал о следующем:
1. Извлечь текст предупреждения
2. Проверить наличие следующего текстового тега. Если у него нет тега забастовки, добавьте пробел к тексту, иначе, если у него есть тег забастовки, присоединяйтесь к нему напрямую.

Вот пример слов, встречающихся в отдельных экземплярах:

<w:r w:rsidRPr:00C42D65>
   <w:rpr>
     <w:strike>
   <w:t>(IQR
<w:r w:rsidRPr:00C42D65>
  <w:rpr>
     <w:strike>
  <w:t>)

Закрывающая скобка связана с (IQR, но в результате грубого подхода она становится
(IQR )

Обновление:

Вот что-то новое, что я пробовал, но я думаю, что мой синтаксис xpath неверен:

text=" "
for p in source.xpath('.//w:p.//w:r',namespaces={'w': w}): #iterate over each run instance
    for q in p.xpath('.//w:t',namespaces={'w': w}):  #check for text
        if q.xpath('/..//w:strike',namespaces={'w': w}):     #if it has strike tag
           text+=''.join(q.text)    #concatenate text
        else:
           text += " "         #else add a space if text has no strike tag  

Похоже, проблема в выражении xpath оператора if.


person Hypothetical Ninja    schedule 09.11.2014    source источник
comment
Почему бы вам не добавить их в список, а не в непрерывную строку, тогда вы можете сосредоточиться на вопросе, как их объединить. Без примера, где слово разбито на несколько тегов, трудно сделать разумные предложения для таких случаев.   -  person jonrsharpe    schedule 09.11.2014
comment
Я добавлю пример разделения слов на несколько тегов.   -  person Hypothetical Ninja    schedule 09.11.2014
comment
Пример добавлен @jonrsharpe, это небольшой фрагмент xml   -  person Hypothetical Ninja    schedule 09.11.2014
comment
@jonrsharpe есть идеи, что не так с обновлением, которое я добавил?   -  person Hypothetical Ninja    schedule 10.11.2014


Ответы (1)


Как насчет использования xpath с namespaces и объединения результатов (списка строк) с ' '.join(..):

...

source = etree.parse(doc_xml)
text = ' '.join(
    source.xpath('.//w:p//w:strike/../..//w:t/text()', namespaces={'w': w})
)

ОБНОВЛЕНИЕ

text = ''
for t in source.xpath('.//w:p//w:r//w:t',namespaces={'w': w}):
    if t.xpath('..//w:strike',namespaces={'w': w}):
        text += t.text
    else:
        if text:  # To prevent space before the first text.
            text += ' '
person falsetru    schedule 09.11.2014
comment
Это то же самое, что и text+= +''.join(b.text) - person Hypothetical Ninja; 09.11.2014
comment
@Swordy, они разные. ''.join('text') == 'text'. - person falsetru; 09.11.2014
comment
@Swordy, это похоже на внутренний цикл text += ' ' + b.text. (кроме первого элемента) - person falsetru; 09.11.2014
comment
есть ли не равная функция для соответствия некоторому атрибуту, который не встречается ?? Как здесь: stackoverflow.com/questions/13219180/ - person Hypothetical Ninja; 09.11.2014
comment
@Swordy, Да, есть: .//element[not(@attribute-you-dont-want)]. Для других, пожалуйста, найдите xpath. - person falsetru; 09.11.2014