PyQuery HTML如何选择(第二个标签,第n个孩子)

时间:2019-01-08 12:34:07

标签: web-crawler pyquery

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'

但这是错误的

1 个答案:

答案 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