【问题标题】:How could I use PyQuery traversal correctly?如何正确使用 PyQuery 遍历?
【发布时间】:2017-12-12 10:18:39
【问题描述】:

有一个名为“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获取所有输入标签,然后遍历输入标签

使用 '.filter' 获取所有姓名等级和年龄等级

最后,获取name和age的值,并将所有结果写入一个名为'name_file.txt'的文件中

我的代码在下面

# -*- 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。我得到的结果不是“Michael:22”,而是“Michael:None”和“None:22”

2。我写入的“name_file”的内容只是“None:None”,并不是我得到的所有结果。

【问题讨论】:

    标签: python python-2.7 pyquery


    【解决方案1】:

    第一个问题源于您循环遍历所有&lt;input ... &gt; 元素(由doc('input') 收集),因此您只能获得名称或年龄,而不是两者。您可以做的是遍历单个 &lt;td&gt; ... &lt;/td&gt; 块并提取匹配的孩子 - 有点浪费,但要符合您的想法:

    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 文件,写入一行然后在每个循环中关闭它 - 当您以写入模式打开文件时,它将截断其中的所有内容,以便您保留为每个循环写第一行。尝试这样做:

    from pyquery import PyQuery as pq
    
    doc = pq(filename='name.txt')  # open our document from `name.txt` file
    
    with open("name_file.txt", "w") as f:  # open name_file.txt for writing
        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 values to the STDOUT as name:age
            f.write("{}:{}\n".format(name, age))  # write to the file as name:age + a new line 
    

    【讨论】:

    • 从你的第二个代码中,这不是循环第一个 的元素而不是连续的或其他 的元素吗?
    • 非常感谢您的大力帮助
    • @AakashVerma - 不,它不会,它会遍历所有 &lt;td&gt; ... &lt;/td&gt; 块,其中在 OP 的情况下有两个。
    • 不错 :) 我喜欢它。
    【解决方案2】:
    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()
    

    您不能在循环中包含文件打开语句,否则您只会在每次循环迭代中只用一条记录覆盖文件。

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

    【讨论】:

    • 这最终会遇到与 OP 示例相同的问题 - 它列出了单个 input 字段,而不管它们的分组 &lt;td&gt; ... &lt;/td&gt;,它只会在每个循环中产生 &lt;class&gt;:&lt;value&gt; 输出(例如 @ 987654325@、age:22 等)而不是 OP 所需的 Michael:22、Jack:23 等。
    • @zwer 很抱歉,我没有关注我的代码做了什么。这是 110% 的工作。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签