2

下面的链接为我们提供了食谱列表中的成分列表。我想提取成分的名称并使用 python 将其保存到另一个文件中。 http://stream.massey.ac.nz/file.php/6087/Eva_Material/Tutorials/recipebook.xml

到目前为止,我已经尝试使用以下代码,但它给了我完整的配方,而不是成分的名称:

from xml.sax.handler import ContentHandler
import xml.sax
import sys
def recipeBook(): 
    path = "C:\Users\user\Desktop"
    basename = "recipebook.xml"
    filename = path+"\\"+basename
    file=open(filename,"rt")
    # find contents 
    contents = file.read()

    class textHandler(ContentHandler):
      def characters(self, ch):
      sys.stdout.write(ch.encode("Latin-1"))
    parser = xml.sax.make_parser()
    handler = textHandler( )
    parser.setContentHandler(handler)
    parser.parse("C:\Users\user\Desktop\\recipebook.xml")



  file.close()

如何提取每种成分的名称并将它们保存到另一个文件中?

4

3 回答 3

3

@Neha

我想您现在已经解决了您的请求,这是我使用http://lxml.de/tutorial.html上的教程整理的一小部分。XML 文件保存在“rough_data.xml”中

import xml.etree.cElementTree as etree

xmlDoc = open('rough_data.xml', 'r')
xmlDocData = xmlDoc.read()
xmlDocTree = etree.XML(xmlDocData)

for ingredient in xmlDocTree.iter('ingredient'):
    print ingredient[0].text

对于所有阅读本文的有经验的 Python 程序员,请改进这个“新手”代码。

注意:lxml 包看起来很不错,绝对值得使用。谢谢

于 2013-01-14T15:59:25.983 回答
1

请放置相关的 XML 文本以获得正确的答案。还请考虑将lxml用于任何特定于 xml 的内容(包括 html)。

尝试这个 :

from lxml import etree

tree=etree.parse("your xml here")
all_recipes=tree.xpath('./recipebook/recipe')
recipe_names=[x.xpath('recipe_name/text()') for x in all_recipes]
ingredients=[x.getparent().xpath('../ingredient_list/ingredients') for x in recipe_names]
ingredient_names=[x.xpath('ingredient_name/text()') for x in ingredients]

这只是开始,但我认为你从这里得到了想法 -> 从每个成分名称中获取父级,从那里获取成分/数量等等。由于文档的结构化性质,我认为您无法真正进行任何其他类型的搜索。

您可以在 [www.lxml.de] 上阅读更多信息

于 2012-05-07T06:59:44.077 回答
0

前段时间,我制作了一系列截屏视频,解释如何从网站收集数据。代码在 Python 中,有 2 个关于使用lxml库解析 XML 的视频。所有视频都发布在这里:http ://railean.net/index.php/2012/01/27/fortune-cowsay-python-video-tutorial

你想要的是:

  • XPath 实验和查询示例
  • Python 和 LXML,使用 Python 进行 XPath 查询的示例
  • 使用 lxml 通过 HTTP 和 HTML 解析自动检索页面

您将学习如何编写和测试 XPath 查询,以及如何在 Python 中运行此类查询。这些示例很简单,希望对您有所帮助。

于 2012-05-18T22:22:01.180 回答