PyQuery HTML, как выбрать (второй тег, nth-child) - PullRequest
0 голосов
/ 08 января 2019
a='''
<p id="A" class="hello beauty"></p>
<v id="XXX" c=1234>
<p id="B" class="beauty"></p>
<v id="YYY" c=5678>
<p id="C" class="beauty" ></p>
<p id="D" class="beauty" ></p>'''

from pyquery import PyQuery
html = PyQuery(a)

1.QUESTIONS

Я пытаюсь получить второе значение c -5678-

HTML ( 'v') [1] .attr ( 'с')

это покажет ошибку 'HtmlElement' объект не имеет атрибута 'attr'

Так как я могу это сделать?

2.Questions

Я пытаюсь найти решение первых вопросов, но у меня случилась другая проблема.

HTML ( 'р: п-й ребенок (1)'). Атр ( 'ID')

Я получаю 'A'

HTML ( 'р: п-й ребенок (2)'). Атр ( 'ID')

Я получаю 'D'

HTML ( 'р: п-й ребенок (3)'). Атр ( 'ID')

Я ничего не получаю

где 'B'and'C'?

Я думаю

html('p:nth-child(2)').attr('id') получит 'B'

html('p:nth-child(3)').attr('id') получит 'C'

html('p:nth-child(4)').attr('id') получит 'D'

Но это неправильно

1 Ответ

0 голосов
/ 18 января 2019

Вы попали в замешательство. Это часто возникает и с 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-ребенок .

...