Как в XPATH получить содержимое тега вместе с внутренними тегами?

Добрый день, есть задача вытащить из html страницы полное содержимое тега, вместе с внутренними тегами.
Например:
<html>
 <body>
  <div class="post">
   text <p> text </p> text <a> text </a>
   <span> text </span>
  <div class="post">
   another text <p> text </p>
 </body>
</html>

И получить нужно первый <div class="post">
text <p> text </p> text <a> text </a>
   <span> text </span>


Пока получается доставать только текст, вот этим выражением (здесь еще игнорирование тега script есть):
(//div[@class="post"])[1]/descendant-or-self::*[not(name()="script")]/text()

Результат: text text text text text

Если использовать node(), то каждый тег возвращается в виде объекта и как все это в строку в виде html превратить не знаю. Возвращается, что-то типа этого (Вот эти <Element p at 0xb62f939c> как преобразовать обратно, не знаю):
[<Element div at 0xb648193c>, u'\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u0430\u043c\u0438', <Element p at 0xb62f939c>, ...]


Есть вариант использовать BeautifulSoup, но я все еще надеюсь на xpath, помогите.

soup = BeautifulSoup(html)
text = [child.strip() if isinstance(child, str) else str(child) for child in soup.find('div', attrs={'class': 'post'})]
text = ''.join(text)
print text
  • Вопрос задан
  • 11189 просмотров
Пригласить эксперта
Ответы на вопрос 3
@belanchuk
Припоздал конечно.. :)
from lxml.html import fromstring
string = '''<html>
 <body>
  <div class="post">
   text <p> text </p> text <a> text </a>
   <span> text </span>
  <div class="post">
   another text <p> text </p>
 </body>
</html>'''
html = fromstring(string)
post = html.xpath('.//div[@class="post"]')[0].text_content()
print post
Ответ написан
Комментировать
loader777
@loader777
Python/django разработчик
а /html() - не работает?
Ответ написан
sim3x
@sim3x
from lxml import etree

tree = etree.fromstring('<html><head><title>foo</title></head><body><div class="name"><p>foo</p></div><div class="name"><ul><li>bar</li></ul></div></body></html>')
for elem in tree.xpath("//div[@class='name']"):
     # pretty_print ensures that it is nicely formatted.
     print etree.tostring(elem, pretty_print=True)


from lxml import etree, html

tree = html.parse('http://rutracker.org/forum/index.php')
for elem in tree.xpath("//div[@class='category']"):
     print html.tostring(elem, pretty_print=True)


"Ваша Галя балувана"(с)
from StringIO import StringIO
from lxml import etree, html
import requests

c = requests.get('http://rutracker.org/forum/index.php').content

tree = html.parse(StringIO(s))

for elem in tree.xpath("//div[@class='category']"):
     print html.tostring(elem, pretty_print=True)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы