我怎么能正确使用PyQuery遍历?

时间:2017-07-08 03:41:49

标签: python python-2.7 pyquery

有一个名为" name.txt"的文件。
内容如下

<td>    
    <input class="name" value="Michael">    
    <input class="age" value="22">    
    <input class="location" value="hebei">

</td>


<td>
    <input class="name" value="Jack">
    <input class="age" value="23">
    <input class="location" value="NewYo">
</td>

现在我想使用pyquery获取所有输入标记,然后遍历输入标记

使用&#39; .filter&#39;获得所有名称类和年龄等级

最后,获取name和age的值,并将所有结果写入名为&#39; name_file.txt&#39;的文件中。

我的代码在

之下
# -*- coding: utf-8 -*-
from pyquery import PyQuery as pq
doc = pq(filename='name.txt')

input = doc('input')

for result in input.items():
    name_result = result.filter('.name')
    age_result = result.filter('.age')
    name = name_result.attr('value')
    age = age_result.attr('value')
    print "%s:%s" %(name,age)
    c = "%s:%s" %(name,age)
    f = file('name_file.txt','w')
    f.write(c) 
    f.close()

但是现在,我遇到了2个问题

1。我得到的结果不是&#34; Michael:22&#34;,他们是&#34;迈克尔:没有&#34;和&#34;无:22&#34;

2。 &#39; name_file&#39;的内容我写的只是&#39;无:没有&#39;,不是我得到的所有结果。

2 个答案:

答案 0 :(得分:2)

第一个问题源于您循环遍历所有fade-in元素(由<input ... >收集),因此您只能获取名称或年龄,而不是两者。你可以做的是循环遍历各个doc('input')块并提取匹配的孩子 - 有点浪费但是要与你的想法保持一致:

<td> ... </td>

至于第二部分 - 你是在写模式下打开你的from pyquery import PyQuery as pq doc = pq(filename='name.txt') # open our document from `name.txt` file for result in doc('td').items(): # loop through all <td> ... </td> items name_result = result.find('.name') # grab a tag with class="name" age_result = result.find('.age') # grab a tag with class="age" name = name_result.attr('value') # get the name's `value` attribute value age = age_result.attr('value') # get the age's `value` attribute value print("{}:{}".format(name, age)) # print it to the STDOUT as name:age 文件,写一行然后在每个循环上关闭它 - 当你在写模式下打开文件时它将截断它中的所有内容你继续写每个循环的第一行。试着这样做:

name_file.txt

答案 1 :(得分:0)

from pyquery import PyQuery as pq
doc = pq(filename = 'text.txt')

input=doc.children('body')

f = file('name_file.txt', 'w')

for x in [result.html() for result in input.items('td')]:
    x=pq(x)
    name = x('input').eq(0).attr('value')
    age = x('input').eq(1).attr('value')
    print "%s:%s" % (name, age)
    c = "%s:%s" % (name, age)
    f.write(c)

f.close()

你不能在循环中使用文件打开语句,否则你只需要在每次循环迭代时只用一条记录覆盖文件。

同样,你在循环之后关闭它,而不是在插入每条记录之后关闭它。

相关问题