【问题标题】:How do I load an .xml file from disk as an element tree using lxml?如何使用 lxml 从磁盘加载 .xml 文件作为元素树?
【发布时间】:2016-05-10 04:28:04
【问题描述】:

我的驱动器上有一系列 XML 文件,我想执行以下操作:

  • 作为元素树加载到 lxml 并使用 xpath 解析
  • 加载另一个 XML 文件作为元素树并使用 xpath 解析以找到正确的位置以将信息附加到
  • 我从一系列 XML 文件中解析的信息应该设置为变量,这样我就可以在结果上运行一些逻辑,然后再附加回大的 .xml 文件

我在文件类型/将 XML 文件正确加载为元素树时遇到了一些问题,以便 lxml 可以对它们进行操作。我已经尝试了几种不同的方法,但不断遇到各种问题。当前问题如下:

TypeError:参数“_parent”的类型不正确(预期 lxml.etree._Element,得到列表)

from lxml import etree
from lxml import html
import requests

file = 'bgg.xml'
# parse the xml file from disk as an element tree in lxml?
treebgg = etree.parse(file)

# create a list of IDs to iterate through from the bgg.xml file
gameList = treebgg.xpath("//root/BGG/@ID")

# iterate through the IDs
for x in reversed(gameList):
    url = 'https://somewhere.com/xmlapi/' + str(x)
    page = requests.get(url)
    # pull an xml file from a web url and turn it into an element tree in lxml
    tree = html.fromstring(page.content)
    # set my root variable so I can append children to this location
    root = tree.xpath("//root/BGG[@ID=x]")
    name = tree.xpath("//somewhere/name[@primary='true']"
    # append child info into bgg.xml
    child = etree.SubElement(root, "Name")
    child.text = name

# write bgg.xml back to file

【问题讨论】:

    标签: python xml xpath xml-parsing lxml


    【解决方案1】:

    获取bgg.xml树的根:

    rootbgg = treebgg.getroot()
    

    并用它来将孩子附加到:

    child = etree.SubElement(rootbgg, "Name")
    

    我遇到了另一个问题...如何选择正确的元素?我不想附加到 xml 文件本身的根目录。

    您现在需要重新设计迭代元素的方式:

    gameList = treebgg.xpath("//root/BGG")
    
    # iterate through the IDs
    for game in reversed(gameList):
        url = 'https://somewhere.com/xmlapi/' + game.attrib["id"]
        page = requests.get(url)
        tree = html.fromstring(page.content)
        # TODO: get the name
    
        # append child info into bgg.xml
        child = etree.SubElement(game, "Name")
        child.text = name
    

    【讨论】:

    • 我尝试了 rootbgg = treebgg.getroot() 但我遇到了另一个问题...如何选择正确的元素?我不想附加到 xml 文件本身的根目录。 Hi #append here
    • @Aro 更新了示例代码以继续。我希望我能理解您要正确执行的操作。
    • 谢谢!这解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多