使用Python从XML文件中提取元素

时间:2012-05-07 01:14:51

标签: python xml-parsing

以下链接为我们提供了食谱清单中的成分列表。我想提取成分的名称,并使用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()

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

3 个答案:

答案 0 :(得分: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包看起来非常好,绝对值得使用。 感谢

答案 1 :(得分: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]

上阅读更多内容

答案 2 :(得分: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中运行此类查询。这些例子很简单,我希望你会发现它们很有帮助。