Получить данные между двумя тегами в Python

<h3>
<a href="article.jsp?tp=&arnumber=16">
Granular computing based
<span class="snippet">data</span>
<span class="snippet">mining</span>
in the views of rough set and fuzzy set
</a>
</h3>

Используя Python, я хочу получить значения из тега привязки, который должен быть интеллектуальным анализом данных на основе гранулярных вычислений в представлениях грубого набора и нечеткого набора.

Я пытался использовать lxml

parser = etree.HTMLParser()
tree   = etree.parse(StringIO.StringIO(html), parser)                   
xpath1 = "//h3/a/child::text() | //h3/a/span/child::text()"
rawResponse = tree.xpath(xpath1)              
print rawResponse

и получить следующий вывод

['\r\n\t\t','\r\n\t\t\t\t\t\t\t\t\tgranular computing based','data','mining','in the view of roughset and fuzzyset\r\n\t\t\t\t\t\t\]

person Jack    schedule 26.05.2013    source источник
comment
Вы должны использовать lxml? Потому что я, вероятно, мог бы придумать решение с BeautifulSoup   -  person TerryA    schedule 26.05.2013


Ответы (2)


Вы можете использовать метод text_content:

import lxml.html as LH

html = '''<h3>
<a href="article.jsp?tp=&arnumber=16">
Granular computing based
<span class="snippet">data</span>
<span class="snippet">mining</span>
in the views of rough set and fuzzy set
</a>
</h3>'''

root = LH.fromstring(html)
for elt in root.xpath('//a'):
    print(elt.text_content())

урожаи

Granular computing based
data
mining
in the views of rough set and fuzzy set

или, чтобы удалить пробел, вы можете использовать

print(' '.join(elt.text_content().split()))

чтобы получить

Granular computing based data mining in the views of rough set and fuzzy set

Вот еще один вариант, который может оказаться полезным:

print(' '.join([elt.strip() for elt in root.xpath('//a/descendant-or-self::text()')]))

урожаи

Granular computing based data  mining in the views of rough set and fuzzy set

(Обратите внимание, однако, что между data и mining остается дополнительный пробел.)

'//a/descendant-or-self::text()' — это более обобщенная версия "//a/child::text() | //a/span/child::text()". Он будет перебирать всех детей и внуков и т. д.

person unutbu    schedule 26.05.2013

С BeautifulSoup:

>>> from bs4 import BeautifulSoup
>>> html = (the html you posted above)
>>> soup = BeautifulSoup(html)
>>> print " ".join(soup.h3.text.split())
Granular computing based data mining in the views of rough set and fuzzy set

Объяснение:

BeautifulSoup анализирует HTML, делая его легко доступным. soup.h3 обращается к тегу h3 в HTML.

.text просто получает все из тега h3, исключая все другие теги, такие как spans.

Здесь я использую split(), чтобы избавиться от лишних пробелов и новых строк, затем " ".join(), поскольку функция разделения возвращает список.

person TerryA    schedule 26.05.2013