使用Python Xpath将数据提取到csv文件

使用Python Xpath将数据提取到csv文件,python,xpath,lxml,Python,Xpath,Lxml,感谢您对Python Xpath的帮助。我有以下xml代码。 目前,我正在使用python,逐行阅读,然后尝试提取它。但我意识到这些表格有1000行长,用一行一行的方式来阅读,并把逻辑放在表格上,这远远超出了我的理解范围 我想从xml代码中提取这些数据并输入到csv文件中 如何使用Xpath实现这一点 示例xml代码: <thead> <tr> <th class="section" data-bind="text: name">Rat

感谢您对Python Xpath的帮助。我有以下xml代码。 目前,我正在使用python,逐行阅读,然后尝试提取它。但我意识到这些表格有1000行长,用一行一行的方式来阅读,并把逻辑放在表格上,这远远超出了我的理解范围

我想从xml代码中提取这些数据并输入到csv文件中

如何使用Xpath实现这一点

示例xml代码:

<thead>
    <tr>
        <th class="section" data-bind="text: name">Ratios</th>
        <!-- ko foreach : $parent.dataPoints -->
            <th>
                <span data-bind="text: absPeriod.indexOf('LTM') != -1 ? 'LTM Ending' : absPeriod">FY2013</span>
                <br>
                <span data-bind="text: periodDate, format: 'date'">30/Jun/2013</span>
            </th>

            <th>
                <span data-bind="text: absPeriod.indexOf('LTM') != -1 ? 'LTM Ending' : absPeriod">FY2014</span>
                <br>
                <span data-bind="text: periodDate, format: 'date'">30/Jun/2014</span>
            </th>

            <th>
                <span data-bind="text: absPeriod.indexOf('LTM') != -1 ? 'LTM Ending' : absPeriod">FY2015</span>
                <br>
                <span data-bind="text: periodDate, format: 'date'">30/Jun/2015</span>
            </th>

            <th>
                <span data-bind="text: absPeriod.indexOf('LTM') != -1 ? 'LTM Ending' : absPeriod">FY2016</span>
                <br>
                <span data-bind="text: periodDate, format: 'date'">30/Jun/2016</span>
            </th>

            <th>
                <span data-bind="text: absPeriod.indexOf('LTM') != -1 ? 'LTM Ending' : absPeriod">LTM Ending</span>
                <br>
                <span data-bind="text: periodDate, format: 'date'">31/Dec/2016</span>
            </th>
        <!-- /ko -->
        <th class="uncheck" data-bind="visible: $root.series().length > 0" style="display: none;">&nbsp;</th>
    </tr>
</thead>
<tbody>
    <!-- ko foreach : dataPoints -->
        <tr data-bind="css: { 'odd': ($index() % 2 == 0) }" class="odd">
            <td class="checkbox left">
                <div class="trigger" data-bind="attr: { 'data-name': property, 'data-group': group }, click: function(data, event) { $root.handleClick($root, data, event); }" data-name="returnAssets" data-group="ratio">
                    <span class="name" data-bind="text: name">Return on Assets</span>
                    <span data-bind="visible: $data.hasOwnProperty('glossaryTerm')">
                        <img src="img/info.png" alt="" data-bind="tooltip: $data.hasOwnProperty('glossaryTerm') ? glossaryTerm : null" tooltip-copy="Return on Assets is a measure of company profitability relative to total assets. It is calculated by dividing tax-effective EBIT (Earnings before Interest and Tax) by Average Total Assets over a 12-months period." class="tooltip-item">
                    </span>
                </div>
                <input type="checkbox">
            </td>
            <!-- ko foreach : $root.dataPoints -->
                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="14.6931" data-name="returnAssets">14.693</td>

                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="13.5242" data-name="returnAssets">13.524</td>

                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="14.5923" data-name="returnAssets">14.592</td>

                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="13.0935" data-name="returnAssets">13.094</td>

                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="15.4657" data-name="returnAssets">15.466</td>
            <!-- /ko -->
            <td class="uncheck" data-bind="visible: $root.series().length > 0, click: function(data, event) { $root.handleClick($root, data, event); }" style="display: none;">
                <span data-bind="visible: $root.canUncheck($root, property)" style="display: none;">[UNCHART]</span>
            </td>
        </tr>

        <tr data-bind="css: { 'odd': ($index() % 2 == 0) }">
            <td class="checkbox left">
                <div class="trigger" data-bind="attr: { 'data-name': property, 'data-group': group }, click: function(data, event) { $root.handleClick($root, data, event); }" data-name="returnCapital" data-group="ratio">
                    <span class="name" data-bind="text: name">Return on Capital</span>
                    <span data-bind="visible: $data.hasOwnProperty('glossaryTerm')">
                        <img src="img/info.png" alt="" data-bind="tooltip: $data.hasOwnProperty('glossaryTerm') ? glossaryTerm : null" tooltip-copy="Return on Capital is a measure of company profitability relative to total capitals. It is calculated by dividing tax-effective EBIT (Earnings before Interest and Tax) by Average Total Capital over a 12-months period." class="tooltip-item">
                    </span>
                </div>
                <input type="checkbox">
            </td>
            <!-- ko foreach : $root.dataPoints -->
                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="30.0726" data-name="returnCapital">30.073</td>

                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="25.6597" data-name="returnCapital">25.66</td>

                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="26.4617" data-name="returnCapital">26.462</td>

                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="26.0215" data-name="returnCapital">26.021</td>

                <td data-bind="text: $data.hasOwnProperty($parent.property) &amp;&amp; $data[$parent.property] != null? $data[$parent.property] : '-', formatNonZeroValue: 'number', attr: { 'data-value': $data.hasOwnProperty($parent.property) ? $data[$parent.property] : null, 'data-name': $parent.property }" data-value="27.67" data-name="returnCapital">27.67</td>
            <!-- /ko -->
            <td class="uncheck" data-bind="visible: $root.series().length > 0, click: function(data, event) { $root.handleClick($root, data, event); }" style="display: none;">
                <span data-bind="visible: $root.canUncheck($root, property)" style="display: none;">[UNCHART]</span>
            </td>
        </tr>
</tbody>

比率
2013财年

2013年6月30日 2014财年
2014年6月30日 2015财年
2015年6月30日 2016财年
2016年6月30日 LTM结束
2016年12月31日 资产回报率 14.693 13.524 14.592 13.094 15.466 [联合国人权理事会] 资本回报率 30.073 25.66 26.462 26.021 27.67 [联合国人权理事会]
以表格报告形式输出到excel的示例


是的,可以使用lxml.etree解析html。但确切的代码取决于文件中使用的名称空间。 假设你有

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
给你:

['FY2013', 'FY2014', 'FY2015', 'FY2016', 'LTM Ending']
['30/Jun/2013', '30/Jun/2014', '30/Jun/2015', '30/Jun/2016', '31/Dec/2016']
['14.693', '13.524', '14.592', '13.094', '15.466']
['30.073', '25.66', '26.462', '26.021', '27.67']

从这一点开始,您现在可以将数据放在CSV中(很抱歉,我不知道这一点)。

我以前必须解决这个问题,并为编写了一个HTML解析器,以获得对表的编程访问

您应该将lxml.html用于html,而不是lxml.etree。界面基本相同

基本上,您应该循环遍历每个
元素以提取行(
tr
),每个
tr
以提取
td
th
,并从中获取文本。我不会过分说明你想要得到的元素


如果您遇到了一个问题,然后不得不重新构造您得到的数据,您可能会发现有用的。[免责声明:我写了大部分内容]

不幸的是,这不是XML,而是HTML,后者在标记规则上不如前者严格,而且解析XML失败。例如,

标记应该是自动关闭的

格式良好的XML,这甚至会中断XPath调用。我应该使用什么其他方法来获取所需的输出表?
['FY2013', 'FY2014', 'FY2015', 'FY2016', 'LTM Ending']
['30/Jun/2013', '30/Jun/2014', '30/Jun/2015', '30/Jun/2016', '31/Dec/2016']
['14.693', '13.524', '14.592', '13.094', '15.466']
['30.073', '25.66', '26.462', '26.021', '27.67']