从文本文件中查找第四行实例,然后截断

时间:2017-06-24 22:04:17

标签: python python-3.x find rss truncate

我正在尝试重新格式化RSS文件,经常将较长的复杂条目添加到该文件的开头。我是一个菜鸟,不知道从哪里开始,所以我在这个网站上寻找解决方案,但还没找到。有些命令对我来说很陌生,但是我已经使用了很多文件并按计划下载了一个feed。

我正在尝试在RSS提要中找到第四项(由“/ item”标签表示)但是,这是我遇到无法找到答案的障碍。

(Python 3)

import time
import sched
import urllib.request
import shutil
scheduler = sched.scheduler(time.time, time.sleep)
def rss():
    # Download the file from `url` and save it locally under `file_name`:
    with urllib.request.urlopen('http://any.website.here/rss') as response, open('test.xml', 'wb') as out_file:
        shutil.copyfileobj(response, out_file)
    print('Updating RSS')
def trunc():
    a = ()
    a = open('test.xml', 'r+', encoding = 'utf-8')
    c = (0)
    for line in a:
        if a.readline() == '</item>':
            c = c+1
            print(c, 'items found!' at )
        if c == 4:
            return a.tell()
    a.seek(0), print(a.read())
    a.close
def scheduler_rss():
    scheduler.enter(0, 1, rss, ())  # calls rss
    scheduler.run()
    trunc()
   #time.sleep(43200) #time in seconds, this is 12 hours
    time.sleep(30)  #Variable for testing

for i in range(100):
    scheduler_rss()

这只是许多尝试找到解决方案的失败尝试的最新版本。

无论如何,这是我一直在与... http://nightvale.libsyn.com/rss搏斗的RSS,它会将文件复制到我的硬盘上,然后我会告诉它,然后可以通过RSS源读取该文件读者(在我看来是一个自动收报机)。基本上,我想我在问:如何找到文件中的位置从该点截断文件,这一点是第四次在.xml文件中调用标记,请记住Feed将是定期更新,每个版本的标签不会在同一位置?

1 个答案:

答案 0 :(得分:0)

如果您对不同的方法感兴趣,可以使用python的xml.dom模块执行此操作。您也可以使用xml.etree执行此操作。

from xml.dom.minidom import parse, parseString
dom = parse('test.xml')

... # download and save your xml
items = dom.getElementsByTagName('item')
for item in items:
    for child in item.childNodes[:4]:
        if len(child.childNodes) > 0:
            print(child.tagName + ':', child.firstChild.nodeValue) 

为每个<item>标记打印这样的内容直到第4个:

title: 110 - Matryoshka
pubDate: Thu, 15 Jun 2017 04:00:00 +0000
guid: ef49bfbd9603243db217053194cc2dc0
link: http://nightvale.libsyn.com/110-matryoshka
...

现在,要截断第4个元素之外的所有项目:

parentNode = items[0].parentNode    
for i in range(4, len(items)):
    parentNode.removeChild(items[i])

dom.writexml(open('test2.xml', 'w'))