Разбор HTML с использованием lxml кода - PullRequest
1 голос
/ 13 апреля 2011

У меня есть следующий HTML-код: -

<table class="results">
  <tr>
    <td>
      <a href="..">link</a><span>2nd Mar 2011</span><br>XYZ Consultancy Ltd<br>
       <div>....</div>
    </td>
  </tr>
</table>

Я использую код lxml + python для разбора файла HTML. Я хочу получить "XYZ Consultancy Ltd", но не могу узнать, как это сделать. Пока мой код выглядит следующим образом: -

import lxml.html
for el in root.cssselect("table.results"):    
 for el2 in el: #tr tags
  for e13 in el2:#td tags
     for e14 in e13:
      if ( e14.tag == 'a') :
         print "keyword: ",e14.text_content()
      if (e14.tag == 'span'):
         print "date: ",e14.text_content()

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Вы можете использовать CSS Selector +, прямой смежный комбинатор , чтобы получить <br>, предшествующий тексту. Затем целевой текст содержится в его атрибуте tail.

import lxml.html
root = lxml.html.fromstring('''
<table class="results">
  <tr>
    <td>
      <a href="..">link</a><span>2nd Mar 2011</span><br>XYZ Consultancy Ltd<br>
       <div>....</div>
    </td>
  </tr>
</table>
''')
for br_with_tail in root.cssselect('table.results > tr > td > a + span + br'):
    print br_with_tail.tail
    # => XYZ Consultancy Ltd
1 голос
/ 13 апреля 2011

Один из способов сделать это - использовать XPath для поиска такого узла a и проверить, что следующие два элемента - span и br.Если это так, посмотрите на атрибут tail элемента br:

из lxml import etree

data = '''<table class="results">
  <tr>
    <td>
      <a href="..">link</a><span>2nd Mar 2011</span><br>XYZ Consultancy Ltd<br>
       <div>....</div>
    </td>
  </tr>
</table>'''

root = etree.HTML(data)

for e in root.xpath('//table[@class="results"]/tr/td/a'):
    parsed_tag = e.text
    next = e.getnext()
    if next is None or next.tag != 'span':
        continue
    parsed_date = next.text
    next_next = next.getnext()
    if next_next is None or next_next.tag != 'br':
        continue
    print 'tag: ', parsed_tag
    print 'date: ', parsed_date
    print 'company: ', next_next.tail
...