В следующем 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.