Форум сайта python.su
0
Народ, подскажите…
На странице есть тег <p> вида:
<p xmlns="http://www.w3.org/1999/xhtml">Текст<br/>Текст2<br/>Текст3 и т.д.<br/><p>
doc = lxml.html.document_fromstring(getPage(URL,getCookies(PARAMETERS))) pages = doc.xpath(PATHPOSTBOX)
pages[0].text
Отредактировано kappa-sama (Окт. 24, 2012 20:37:57)
Офлайн
173
pages[0].text_content()
texts = doc.xpath('НЕИЗВЕСТНО//text()') text = '\n'.join(texts)
Офлайн
14
Тоже как раз возился с этой темой. .text - текст внутри тега. Просто текст вводится через tag.tail, tag - идущий перед текстом тег.
Т.е. как я понимаю, весь текст должен быть доступен или через .text, или через .tail.
lxml, видимо, интерпретирует дерево так:
p--| text = "текст1"
br tail = "тескт2"
br tail = "текст3"
Отредактировано odnochlen (Окт. 24, 2012 22:04:43)
Офлайн
0
reclosedev
Спасибо, второй вариант - то что нужно.
odnochlen
Я тоже уже об этом подумывал, но, к счастью, обошлось)
Офлайн
14
Тогда я свое здесь оставлю.
Как удалить определенную разметку и оставить текст? Например, таблицы?
Как заменить больше 2 <br> подряд без текста между ними? Регекспами - элементарно.
В чем разница между Element и lxml.etree._ElementTree и почему parse() возвращает tree, а document_fromstring() - корневой Element?
Это баг?
from lxml.html import builder as E print lxml.etree.tostring(E.HTML(E.BR(), E.BR())) # <html><br/><br/></html> br = E.BR() print lxml.etree.tostring(E.HTML(br, br)) # <html><br/></html>
E.BR(tail='text')
Отредактировано odnochlen (Окт. 25, 2012 05:06:02)
Офлайн
173
odnochlen
Как удалить определенную разметку и оставить текст? Например, таблицы?
Как заменить больше 2 <br> подряд без текста между ними? Регекспами - элементарно.
# -*- coding: utf-8 -*- import lxml.html from lxml.html.clean import Cleaner html = """ <html> <body> <div id="remove_table"> before table <table> <tr> <td>11</td> <td>12</td> </tr> <tr> <td>21</td> <td>22</td> </tr> </table> after table </div> <div id="remove_br"> line1<br/> line2<br/> text <br/><br/><br/> </div> </body> </html> """ # Как удалить определенную разметку и оставить текст? Например, таблицы? cleaner = Cleaner(remove_tags=['table', 'td', 'tr']) print cleaner.clean_html(html) # Как заменить больше 2 <br> подряд без текста между ними? doc = lxml.html.fromstring(html) elements = doc.xpath('//br[count(preceding-sibling::br) >= 2]') for el in elements: if not el.tail: el.getparent().remove(el) print lxml.html.tostring(doc)
odnochlenhttp://lxml.de/tutorial.html#the-elementtree-class
В чем разница между Element и lxml.etree._ElementTree и почему parse() возвращает tree, а document_fromstring() - корневой Element?
An ElementTree is mainly a document wrapper around a tree with a root node. It provides a couple of methods for parsing, serialisation and general document handling. One of the bigger differences is that it serialises as a complete document, as opposed to a single Element. This includes top-level processing instructions and comments, as well as a DOCTYPE and other DTD content in the document
odnochlenНаверное нет, нужно новый элемент создавать.
Это баг?
odnochlenв конструкторе текст, аттрибуты или дети, придется писать на строчку больше
Можно сделать как-то так?
E.BR(tail='text')
br = E.BR() br.tail = 'text'
odnochlenВ ситуации когда регекспы проще и понятней, почему бы их не использовать?
Сидишь над ней и думаешь - может ну его нах и уже регекспами все сделать?
Отредактировано reclosedev (Окт. 25, 2012 10:15:52)
Офлайн
14
reclosedevВ таком случае - ощутимо больше.
в конструкторе текст, аттрибуты или дети, придется писать на строчку больше
lxml.etree.tostring(E.HTML( E.BR(), E.BR() ))
Офлайн
173
odnochlenЕсли реальная необходимость есть, можно функцию-помощник написать: def BR(tail=''): …
В таком случае - ощутимо больше.
Офлайн
14
reclosedevИнтересно, но я до этого еще не дошел. Как я понял, на отсутствие текста между br оно не проверяет?elements = doc.xpath('//br[count(preceding-sibling::br) >= 2]')
reclosedevЭто не совсем ответ на мой вопрос.
http://lxml.de/tutorial.html#the-elementtree-classAn ElementTree is mainly a document wrapper around a tree with a root node. It provides a couple of methods for parsing, serialisation and general document handling. One of the bigger differences is that it serialises as a complete document, as opposed to a single Element. This includes top-level processing instructions and comments, as well as a DOCTYPE and other DTD content in the document
reclosedevИ это можно узнать опять же методом тыка.
odnochlen
Это баг?
Наверное нет, нужно новый элемент создавать.
reclosedevНу вот, а то чуть что, так сразу дают ссылку.
Согласен, что br проще регекспом
Офлайн
14
reclosedevС хвостом проще, но аттрибуты - только через костыли.br = E.BR() br.tail = 'text'
E.BR(), text, E.BR()
Офлайн