2015-04-28 3 views
2

Я пытаюсь извлечь весь контент (теги и текст) из одного основного тега на странице html. Например:Как получить весь контент между двумя тегами html в Python?

`my_html_page = ''' 
<html> 
    <body> 
     <div class="post_body"> 
      <span class="polor"> 
      <a class="p-color">Some text</a> 
      <a class="p-color">another text</a> 
      </span> 
      <a class="p-color">hello world</a> 
      <p id="bold"> 
       some text inside p 
      <ul> 
       <li class="list">one li</li> 
       <li>second li</li> 
      </ul> 
     </p> 
     some text 2 
     <div> 
      text inside div 
     </div> 
     some text 3 
     </div> 
     <div class="post_body"> 
      <a>text inside second main div</a> 
     </div> 
     <div class="post_body"> 
      <span>third div</span> 
     </div> 
     <div class="post_body"> 
      <p>four div</p> 
     </div> 
     <div class="post"> 
      other text 
     </div> 
    </body> 
<html>'''` 

И мне нужно, чтобы получить с помощью XPath ("(//div[@class="post_body"])[1]"):

` 
     <div class="post_body"> 
      <span class="polor"> 
      <a class="p-color">Some text</a> 
      <a class="p-color">another text</a> 
      </span> 
      <a class="p-color">hello world</a> 
      <p id="bold"> 
       some text inside p 
      <ul> 
       <li class="list">one li</li> 
       <li>second li</li> 
      </ul> 
     </p> 
     some text 2 
     <div> 
      text inside div 
     </div> 
     some text 3 
     </div> 
` 

Все внутри тега <div class="post_body">

Я прочитал this topic, но это не помогло.

Мне нужно создать DOM парсером beautifulsoup в lxml.

import lxml.html.soupparser 
import lxml.html 
text_inside_tag = lxml.html.soupparser.fromstring(my_html_page) 
text = text_inside_tag.xpath('(//div[@class="post_body"])[1]/text()') 

И я могу извлечь только текст внутри тега, но мне нужно извлечь текст с помощью тегов.

Если я попытался использовать это:

for elem in text.xpath("(//div[@class="post_body"])[1]/text()"): 
    print lxml.html.tostring(elem, pretty_print=True) 

У меня есть ошибка: TypeError: Type '_ElementStringResult' cannot be serialized.

Помощь, пожалуйста.

+0

Ожидаете ли вы только текст в выводе? – Vilva

+0

@Vilva Нет, мне нужен текст с тегами на выходе. '

text text text
' я могу извлечь: 'текст текст Text' Мне нужен экстракт:' '
text text text

ответ

2

Вы можете попробовать этот способ:

import lxml.html.soupparser 
import lxml.html 

my_html_page = '''...some html markup here...''' 
root = lxml.html.soupparser.fromstring(my_html_page) 

for elem in root.xpath("//div[@class='post_body']"): 
    result = elem.text + ''.join(lxml.html.tostring(e, pretty_print=True) for e in elem) 
    print result 

result переменная строится путем объединения текстовых узлов в пределах родительского <div> с разметкой всех дочерних узлов.

+0

Вызов LXML является лучшим ответом. –

+0

Спасибо, это он =) –

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