Как исключить текст, привязанный конкретными тегами, из lxml text_content () - PullRequest
0 голосов
/ 06 апреля 2019

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

Вот моя строка:

normal = """
  <p>
    <b>
      <a href='link1'>        Forget me  </a>
    </b>     I need this one      <br>
    <b>
     <a href='link2'>  Forget me too  </a>
    </b> Forget me not <i>even when</i> you go to sleep <br>
    <b>  <a href='link3'>  Forget me three  </a>
    </b>  Foremost on your mind <br>
   </p>    
"""

Я начинаю с:

target = lxml.html.fromstring(normal)
tree_struct = etree.ElementTree(target)  

Теперь мне нужно игнорировать все, что связано с тегом <a>. Но если я запускаю этот код:

for e in target.iter():
   item = target.xpath(tree_struct.getpath(e))
   if len(item)>0:
       print(item[0].text)  

Я ничего не получаю; с другой стороны, если я изменю инструкцию print на:

  print(item[0].text_content()) 

Я получаю этот вывод:

Forget me
 I need this one

 Forget me too

Forget me not
even when
you go to sleep


 Forget me three

Foremost on your mind 

Пока мой желаемый результат:

 I need this one

Forget me not
even when
you go to sleep    

Foremost on your mind 

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

1 Ответ

1 голос
/ 07 апреля 2019

Я думаю, вы делаете это излишне сложным. Нет необходимости создавать объект tree_struct и использовать getpath(). Вот предложение:

from lxml import html

normal = """
  <p>
    <b>
      <a href='link1'>        Forget me  </a>
    </b>     I need this one      <br>
    <b>
     <a href='link2'>  Forget me too  </a>
    </b> Forget me not <i>even when</i> you go to sleep <br>
    <b>  <a href='link3'>  Forget me three  </a>
    </b>  Foremost on your mind <br>
   </p>
"""

target = html.fromstring(normal)

for e in target.iter():
    if not e.tag == "a":
        # Print text content if not only whitespace 
        if e.text and e.text.strip():
            print(e.text.strip())
        # Print tail content if not only whitespace
        if e.tail and e.tail.strip():
            print(e.tail.strip())

Выход:

I need this one
Forget me not
even when
you go to sleep
Foremost on your mind
...