Вы попали в замешательство. Это часто возникает и с jQuery.
, в то время как html является объектом PyQuery, html ('v') возвращает список HtmlElement-s (не PyQuery-объектов). Чтобы вызвать методы PyQuery, вам нужно снова обернуть его в PyQuery. Так что в случае вашего вопроса 1 вам придется переписать так:
PyQuery(html('v')[1]).attr('c')
Что касается вашего второго вопроса, добавление оболочки PyQuery не даст вам желаемого результата. Это потому, что если вы сделаете html.html()
, чтобы увидеть обработанный код, вы получите:
'<p id="A" class="hello beauty"/>\n<v id="XXX" c="1234">\n<p id="B" class="beauty"/>\n<v id="YYY" c="5678">\n<p id="C" class="beauty"/>\n<p id="D" class="beauty"/></v></v>'
Обратите внимание, что это не ваш исходный код, а его модификация, которая пытается сделать его действительным XML. Как следствие, он закрыл ваши теги, когда сочтет нужным, в частности, в конце. Отформатировано это выглядит так:
<p id="A" class="hello beauty"/>
<v id="XXX" c="1234">
<p id="B" class="beauty"/>
<v id="YYY" c="5678">
<p id="C" class="beauty"/>
<p id="D" class="beauty"/>
</v>
</v>
Здесь вы можете видеть, что нет 3-го и 4-го дочерних элементов html. Соответственно, следующее даст вам пустые ответы:
PyQuery(html('p:nth-child(3)')).attr('id')
PyQuery(html('p:nth-child(4)')).attr('id')
То, что вы пытаетесь сделать, может быть достигнуто с помощью:
PyQuery(html('p')[1]).attr('id')
PyQuery(html('p')[2]).attr('id')
PyQuery(html('p')[3]).attr('id')
Обратите внимание, что каждый из этих индексов на один меньше, потому что они являются индексами списка и, таким образом, 0-проиндексированы .
Что-то, что может показаться запутанным, это то, что PyQuery(html('p:nth-child(2)')).attr('id')
фактически возвращает 'D'. Это потому, что соответствующий <p> is a second child within the innermost
`. Вот страница, где можно лучше понять, как работает nth-ребенок .