【问题标题】:Find the fourth instance of a line from a text file, then truncate从文本文件中找到一行的第四个实例,然后截断
【发布时间】:2017-06-24 22:04:17
【问题描述】:

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

我试图在 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()

这只是寻找解决方案的许多失败尝试的最近一次迭代。

无论如何,这是我一直在努力解决的 RSS...http://nightvale.libsyn.com/rss 它确实会按照我的指示将文件复制到我的硬盘上,然后可以通过 RSS 提要阅读器读取该文件(在我的情况下是股票代码)。基本上,我想我在问:我怎样才能找到文件中的位置以从该点截断文件,该点是在 .xml 文件中调用标签的第四次,请记住提要将是定期更新,这个标签不会在每个版本的相同位置?

【问题讨论】:

  • 如果你有兴趣让你的生活变得轻松,那么有大量的 xml 解析器......
  • “第四项”是什么意思?你的意思是你想提取&lt;link&gt;...&lt;/link&gt;标签之间的任何文本?
  • 是的,基本上我想在文件中的第4项之后截断文件中的所有内容,所以有一个带有很多描述的标题(所以它的长度会有所不同),然后是 (这里有各种各样的东西,不同的#和行的长度)。我想要 4 组 ... 然后在最后一组之后截断文件。然后,一旦文件被截断为仅 4 个项目,我将附加结束 和诸如此类的内容。就目前而言,当我只想收到 4 个最新版本的通知时,文件在我的股票行情中滚动了大约 10 分钟。

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


【解决方案1】:

如果您对不同的方法感兴趣,可以使用 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) 

在第 4 个之前为每个 &lt;item&gt; 标签打印类似的内容:

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'))

【讨论】:

  • 工作就像一个魅力,Coldspeed!感谢你的回答;要将它与我的调度程序集成,我只需在编写后将第一和第三位代码放入“def”和“return”。我添加了一些“打印”,所以我知道程序正在做什么以及何时执行。作为该语言的新手,很难找到我需要哪些库,这就像试图描述一只猫而不知道猫有一个非常好的词。
  • @ThomasLoman 我知道你的感受。实际上,我以前从未使用过xml.dom,但是由于我使用过html DOM,因此很快就可以将一些代码放在一起。无论如何,很高兴知道它有效。
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 2020-02-13
  • 1970-01-01
  • 2013-08-21
  • 2011-12-17
  • 2018-06-15
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多