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'
但这是错误的
答案 0 :(得分:1)
您迷上了常见的混乱情况。 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
`。这是一个页面,您可以更好地了解how nth-child works。