Разбор всего текста внутри тега с использованием lxml в python
Я пытаюсь проанализировать HTML-файл, который показан ниже
<ol>
<li>
<div class="c1">
<span class="s1">hi</span>
" hello "
<span class="s2">world!</span>
</div>
</li>
<li>
<div class="c2">
<span class="s3">abc</span>
" def ghijkl "
<span class="s1">mno</span>
" pqr!"
</div>
</li>
</ol>
Я попытался разобрать, используя следующий код
tree = html.fromstring(code.content)
sol = tree.xpath('//ol//text()')
for x in sol:
print x
Я получаю результат, как это
hi
hello
world!
abc
def ghijkl
mno
pqr!
Что я могу сделать, чтобы получить весь текст в каждом <li>
тег в одну строку. т.е. я хочу, чтобы вывод был
hi hello world!
abc def ghijkl mno pqr!
2 ответа
Решение
$ cat a.py
from lxml import etree
xml = """<ol>
<li>
<div class="c1">
<span class="s1">hi</span>
" hello "
<span class="s2">world!</span>
</div>
</li>
<li>
<div class="c2">
<span class="s3">abc</span>
" def ghijkl "
<span class="s1">mno</span>
" pqr!"
</div>
</li>
</ol>"""
tree = etree.fromstring(xml)
sol = tree.xpath('//ol//li')
for a in sol:
print " ".join([t.strip() for t in a.itertext()]).strip()
$ python a.py
hi " hello " world!
abc " def ghijkl " mno " pqr!"
Вы можете получить каждый li и использовать normalize-space:
from lxml import html
h = """<ol>
<li>
<div class="c1">
<span class="s1">hi</span>
" hello "
<span class="s2">world!</span>
</div>
</li>
<li>
<div class="c2">
<span class="s3">abc</span>
" def ghijkl "
<span class="s1">mno</span>
" pqr!"
</div>
</li>
</ol>"""
tree = html.fromstring(h)
for li in tree.xpath("//ol/li"):
print(li.xpath("normalize-space(.)"))
Что дает вам:
hi " hello " world!
abc " def ghijkl " mno " pqr!"