0
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.问题

我试图获得第二个价值c -5678-

html('v')[1].attr('c')

这将显示错误“HtmlElement”对象没有属性“attr”

那么我该怎么做呢?

2.问题

我试图找到如何解决第一个问题,但我遇到了另一个问题。

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'

但这是错误的

4

1 回答 1

2

你已经陷入了一种常见的困惑。它也经常出现在 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>

在这里您可以看到没有 html 的第 3 个和第 4 个孩子。因此,以下内容为您提供空洞的答复:

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')实际上返回了“D”。这是因为对应的<p> is a second child within the innermost`. 这是一个可以更好地了解nth-child 工作原理的页面。

于 2019-01-18T14:03:59.183 回答