2015-12-29 3 views
1

Я пытаюсь получить текст из одного тега, используя lxml etree.Найти текст, используя lxml etree

<div class="litem__type"> 
      <div> 
       Robbp 
      </div> 


        <div>Estimation</div> 

       +487 (0)639 14485653 


           • 
           <a href="mailto:[email protected]"> 
            Email Address 
           </a> 



        • 
        <a class="external" href="http://www.google.com"> 
         Homepage 
        </a> 


     </div> 

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

Я полагаю, что можно было бы извлечь телефон, используя BeautifulSoups, но я пытаюсь использовать lxml модуль xpath.

Есть ли у вас идеи? (Адрес электронной почты не должны быть там иногда)

EDIT: Лучше всего, вероятно, использовать regex, но я не знаю, как сказать ему, что он должен извлечь только текст между двумя <div></div>

ответ

0

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

Текст после закрывающего тега элемента A, но перед открывающим тегом элемента B называется текстом элемента A. Для того, чтобы выбрать этот tail текст с помощью lxml etree вы можете сделать следующее:

content = ''' 
<div class="litem__type"> 
    <div>Robbp</div> 
    <div>Estimation</div> 
    +487 (0)639 14485653 
    <a href="mailto:[email protected]">Email Address</a> 
    <a class="external" href="http://www.google.com">Homepage</a> 
</div>''' 

from lxml import etree 

tree = etree.XML(content) 
phone_number = tree.xpath('div[2]')[0].tail.strip() 
print(phone_number) 

Выход

'+487 (0)639 14485653' 

strip() функция используется здесь, чтобы удалить пробелы по обе стороны от tail текста.

+0

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

+0

Если первого и второго div нет, используйте тот же код, что и я, но с 'phone_number = tree.xpath ('text()') [0] .strip()' – gtlambert

0

Вы можете повторять и получать текст после тега div.

from lxml import etree 
tree = etree.parse("filename.xml") 
items = tree.xpath('//div') 
for node in items: 
    # you can check here if it is a phone number 
    print node.tail