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.
的页面
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.