Если вам нужна поддержка только HTTP прокси (пусть даже с авторизацией), готов реализовать в ближайшее время. Если нужна поддержка SOCKS, то ей не займусь, ибо так и не нашёл, как с такими прокси работать.
Вы правы, действительно иных способов как-то не придумаешь… Наверное мне просто неочевидным когда-то показался факт, что текст надо доставать через предыдущий элемент.
То есть парсить в два прохода? Не думаю, что получится эффективнее.
Если вы о том, чтобы исходный HTML tidy-фицировать заранее, то это не всегда возможно (например, если парсим чужой сайт). Надеюсь, понятно о чём я, не люблю допоздна сидеть, в голове всё путаться начинает.
Ещё во всех питоновских библиотеках для XML, которые я встречал (lxml тоже) не очень приятно работать с XML namespaces.
Если входной XML весь лежит в каком-то безымянном пространстве имён (к примеру, обычный XHTML), то во всех селекторах в коде придётся указывать URI этого пространства имён. Иными словами, плохо, что нет возможности задать дефолтный URI.
Когда-то при генерации XHTML я препопочёл использовать хак и просто задать атрибут xmlns :-)
html = etree.Element('html')
# HACK. Use this because lxml library lacks functions to set default
# XML namespace without inserting namespace URI's into each XML element
# name. For example:
#
# * element.findall('{%s}something' % namespace)
#
# * element.xpath('prefix:something', prefixMap)
#
# Also it seems imposible to use element names that does not have prefix,
# but have namespace (i.e., non-default anonymous namespace) in xpath().
# The xpath() method complains when prefixMap has None key and does not
# consider prefixMap[''] when it is specified… We require anonymous
# namespace in order not to get too verbose output
#
html.set('xmlns', 'http://www.w3.org/1999/xhtml')
head = etree.SubElement(html, 'head')
Насколько я помню, он предназначен для парсинга HTML с незакрытыми тэгами и прочим говном. Поэтому медленный. И использовать его для XML никто в здравом уме не будет.
Кагбэ размер ползунка соответствует размеру области отображения (страницы), длина полосы прокрутки — размеру всей области, доступной для просмотра. Если ползунок находится в самой левой части полосы, его позиция — 0, а в области отображения — область от 0 до {размер страницы}. Соответственно, крайней правой области от {вся длина — размер страницы} до {размер страницы} соответствует позиция ползунка {максимальное значение — размер ползунка}. Позиция ползунка {максимальное значение} соответствовала бы (несуществующей) области от {вся длина} до {вся длина + размер страницы }.
Прошу прощения за сумбурное и плохо отформатированное объяснение. ± 1 я опускал для краткости и чтобы не ошибиться.
> почему при уменьшении свойства LargeChange размер бегунка остается прежним, а максимум достигается?
Если сделать размер ползунка слишком маленьким, пользователь не сможет его курсором таскать.
<p>Привет <img src=«smile.gif» />! </p>
Если вы о том, чтобы исходный HTML tidy-фицировать заранее, то это не всегда возможно (например, если парсим чужой сайт). Надеюсь, понятно о чём я, не люблю допоздна сидеть, в голове всё путаться начинает.
Если входной XML весь лежит в каком-то безымянном пространстве имён (к примеру, обычный XHTML), то во всех селекторах в коде придётся указывать URI этого пространства имён. Иными словами, плохо, что нет возможности задать дефолтный URI.
Когда-то при генерации XHTML я препопочёл использовать хак и просто задать атрибут xmlns :-)
html = etree.Element('html')
# HACK. Use this because lxml library lacks functions to set default
# XML namespace without inserting namespace URI's into each XML element
# name. For example:
#
# * element.findall('{%s}something' % namespace)
#
# * element.xpath('prefix:something', prefixMap)
#
# Also it seems imposible to use element names that does not have prefix,
# but have namespace (i.e., non-default anonymous namespace) in xpath().
# The xpath() method complains when prefixMap has None key and does not
# consider prefixMap[''] when it is specified… We require anonymous
# namespace in order not to get too verbose output
#
html.set('xmlns', 'http://www.w3.org/1999/xhtml')
head = etree.SubElement(html, 'head')
элемент <b> — в b
<a>текст1<b/>текст2</a>
Пусть элемент <a> хранится в объекте под именем a, а элемент <a> — в b. Тогда текст1 попадёт в атрибут a.text, а текст2 — в b.tail.
> крайней правой области от {вся длина — размер страницы} до {размер страницы}
читать
> крайней правой области от {вся длина — размер страницы} до {вся длина}
Кагбэ размер ползунка соответствует размеру области отображения (страницы), длина полосы прокрутки — размеру всей области, доступной для просмотра. Если ползунок находится в самой левой части полосы, его позиция — 0, а в области отображения — область от 0 до {размер страницы}. Соответственно, крайней правой области от {вся длина — размер страницы} до {размер страницы} соответствует позиция ползунка {максимальное значение — размер ползунка}. Позиция ползунка {максимальное значение} соответствовала бы (несуществующей) области от {вся длина} до {вся длина + размер страницы }.
Прошу прощения за сумбурное и плохо отформатированное объяснение. ± 1 я опускал для краткости и чтобы не ошибиться.
> почему при уменьшении свойства LargeChange размер бегунка остается прежним, а максимум достигается?
Если сделать размер ползунка слишком маленьким, пользователь не сможет его курсором таскать.