只打印非空值

Print only not null values

我试图只打印非空值,但我不确定为什么输出中甚至出现了空值:

输入:

from lxml import html
import requests
import linecache

i=1
read_url = linecache.getline('stocks_url',1)
while read_url != '':
        page = requests.get(read_url)
        tree = html.fromstring(page.text)
        percentage = tree.xpath('//span[@class="grnb_20"]/text()')
        if percentage != None:
                print percentage
        i = i + 1
        read_url = linecache.getline('stocks_url',i)

输出:

$ python test_null.py 
['76%']
['76%']
['80%']
['92%']
['77%']
['71%']
[]
['50%']
[]
['100%']
['67%']

您得到的是空列表,而不是 None 个对象。你在这里测试错误的东西;你会看到 [],而如果 Python null 被 return 编辑,你会看到 NoneElement.xpath()方法将总是return一个列表对象,它可以是空的。

使用布尔测试:

percentage = tree.xpath('//span[@class="grnb_20"]/text()')
if percentage:
    print percentage[0]

空列表(和 None)在布尔上下文中测试为 false。我选择打印出 XPath 结果中的第一个元素,你似乎只有一个。

请注意,linecache 主要用于缓存 Python 源文件;它用于在发生错误时以及使用 inspect.getsource() 时显示回溯。它并不是真的要用来读取文件。您可以只使用 open() 并循环遍历文件,而不必不断递增计数器:

with open('stocks_url') as urlfile:
    for url in urlfile:
        page = requests.get(read_url)
        tree = html.fromstring(page.content)
        percentage = tree.xpath('//span[@class="grnb_20"]/text()')
        if percentage:
            print percentage[0]

在您的代码中更改它,它应该可以工作:

if percentage != []: