2017-02-17 11 views
0

Я пытаюсь разобрать большой тег div в своем документе HTML и должен получить все его HTML и вложенные теги внутри div. Мой код:Получить все элементы HTML, используя LXML

innerTree = fromstring(str(response.text)) 
print("The tags inside the target div are") 
print innerTree.cssselect('div.story-body__inner') 

Но он печатает:

[<Element div at 0x66daed0>] 

Я хочу, чтобы вернуть все HTML-теги внутри? Как это сделать с LXML?

+0

в моем случае beautifullsoup не работают очень хорошо и дает мне incorrent HTML-тег !, Я должен найти решение для выше. – Mehdi

ответ

1

LXML - отличная библиотека. Не нужно использовать BeautiulSoup или любой другой. Вот как получить дополнительную информацию, которую вы ищете:

# import lxml HTML parser and HTML output function 
from __future__ import print_function 
from lxml.html import fromstring 
from lxml.etree import tostring as htmlstring 

# test HTML for demonstration 
raw_html = """ 
    <div class="story-body__inner"> 
     <p>Test para with <b>subtags</b></p> 
     <blockquote>quote here</blockquote> 
     <img src="..."> 
    </div> 
""" 

# parse the HTML into a tree structure 
innerTree = fromstring(raw_html) 

# find the divs you want 
# first by finding all divs with the given CSS selector 
divs = innerTree.cssselect('div.story-body__inner') 

# but that takes a list, so grab the first of those 
div0 = divs[0] 

# print that div, and its full HTML representation 
print(div0) 
print(htmlstring(div0)) 

# now to find sub-items 

print('\n-- etree nodes') 
for e in div0.xpath(".//*"): 
    print(e) 

print('\n-- HTML tags') 
for e in div0.xpath(".//*"): 
    print(e.tag) 

print('\n-- full HTML text') 
for e in div0.xpath(".//*"): 
    print(htmlstring(e)) 

lxml Обратите внимание, что функции, такие как cssselect и xpath возвратных списков узлов, а не одиночные узлы. Вы должны индексировать эти списки, чтобы получить включенные узлы, даже если есть только один.

Получить все подтеги или под-HTML может означать несколько вещей: получение узлов ElementTree, получение имен тегов или получение полного текста HTML этих узлов. Этот код демонстрирует все три. Он делает это, используя запрос XPath. Иногда CSS-селектора более удобны, иногда XPath. В этом случае запрос XPath .//* означает «вернуть все узлы с любым именем тега на любой глубине под текущим узлом».

Ниже приведены результаты его запуска под Python 2. (Тот же код работает под управлением Python 3, хотя вывод текст немного отличается, так как etree.tostring возвращает байты строки не Unicode струнных под Python 3.)

<Element div at 0x106eac8e8> 
<div class="story-body__inner"> 
     <p>Test para with <b>subtags</b></p> 
     <blockquote>quote here</blockquote> 
     <img src="..."/> 
    </div> 


-- etree nodes 
<Element p at 0x106eac838> 
<Element b at 0x106eac890> 
<Element blockquote at 0x106eac940> 
<Element img at 0x106eac998> 

-- HTML tags 
p 
b 
blockquote 
img 

-- full HTML text 
<p>Test para with <b>subtags</b></p> 
<b>subtags</b> 
<blockquote>quote here</blockquote> 
<img src="..."/> 
+0

Я надеюсь, что OP примет ваш ответ. Я неправильно понял его вопрос. –

+0

@Mehdi Если это ответит на ваш вопрос, отметьте как «предпочтительный ответ» (по clic поставьте галочку в верхнем левом углу ответа). –

Смежные вопросы