UPD: Ответ на вопрос в топике. Я думаю, что единственно верный вариант — игнорировать завершающую запятую (как делают нормальные браузеры), вариант лаконичный и общепринятый. Лаконичный, потому что при вертикальном форматировании списка можно писать
var array = [
something_1,
something_2,
…
something_n,
];
оставляя последнюю запятую (единообразие — это хорошо). Общепринятый — потому что так можно делать во всех ЯП (например, в Python, в Си, и т.д.). Кстати, какова реакция IE на лишние запятые в конструкции следующего вида?
Если вам нужна поддержка только 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 никто в здравом уме не будет.
var array = [
something_1,
something_2,
…
something_n,
];
оставляя последнюю запятую (единообразие — это хорошо). Общепринятый — потому что так можно делать во всех ЯП (например, в Python, в Си, и т.д.). Кстати, какова реакция IE на лишние запятые в конструкции следующего вида?
var something = {
a: 1,
b: 2,
};
Вывод: не ставить завершающую запятую, ничего другого делать не остаётся…
<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.