PyQuery html如何选择(第二个标签,nth-child)

PyQuery html how to choose ( second tag ,nth-child)

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('c')

这将显示错误 'HtmlElement' object 没有属性 'attr'

那我该怎么做呢?

2.Questions

我试图找到解决第一个问题的方法,但我遇到了另一个问题。

html('p:nth-child(1)').attr('id')

我得到'A'

html('p:nth-child(2)').attr('id')

我得到'D'

html('p:nth-child(3)').attr('id')

我一无所获

'B'和'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'

但是错了

您陷入了一种常见的困惑。它也经常出现 jQuery.

而 html 是一个 PyQuery object, html('v') returns HtmlElement-s (non-PyQuery objects)。为了在其上调用 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>

这里可以看到html的第3个和第4个children没有了。因此,以下内容会给您空洞的答复:

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-indexed.

有些人可能会感到困惑的是 PyQuery(html('p:nth-child(2)')).attr('id') 实际上是 returns 'D'。这是因为对应的<p> is a second child within the innermost`。这是一个可以更好地了解 how nth-child works.

的页面