我想通过python win32com
模块使用 import win32com
from bs4 import BeautifulSoup
oneNoteApp = win32com.client.Dispatch('OneNote.Application')
pageID = '{603BD3F0-4DAB-4E5B-8E28-28CA0F2B0C83}{1}{B0}' # from GetHierarchy
content = oneNoteApp.GetPageContent(pageID)
soup = BeautifulSoup(content, 'xml')
# ... modify xml (changes are valid and tested using MATLAB)
oneNoteApp.UpdatePageContent(soup) # problem is here
COM方法documentation。到目前为止,我可以做的事情包括获取层次结构,获取页面内容等。我甚至可以有效地操作XML来准备更改(使用MATLAB COM接口测试)。
这是我想要做的最小例子:
UpdatePageContent
现在这最后一行很棘手。根据COM文档,win32com
的所有其他参数都是可选的。但是 C:\...\Temp\gen_py\3.4\0EA692EE-BB50-4E3C-AEF0-356D91732725x0x1x0.py in UpdatePageContent(self, bstrPageChangesXmlIn, dateExpectedLastModified, xsSchema, force)
240 _prop_map_get_ = {
241 "COMAddIns": (104, 2, (9, 0), (), "COMAddIns", None),
--> 242 "Dummy1": (102, 2, (11, 0), (), "Dummy1", None),
243 "LanguageSettings": (105, 2, (9, 0), (), "LanguageSettings", None),
244 # Method 'Windows' returns object of type 'Windows'
ValueError: astimezone() cannot be applied to a naive datetime
自动生成的绑定似乎存在错误。在示例中调用我得到像
ExpectedDateLastModified
所以oneNoteApp.UpdatePageContent(content, 0)
默认参数似乎被打破了。传递像pywintypes.TimeType
这样的显式零会产生另一个错误。
我到目前为止尝试过的其他事情是构建一个DateTime.minValue
我自己,其值与.net运行时的astimezone()
常量相同,但是缺少时区信息(pywintypes.TimeType
误差)。
我尝试了几种方法来添加时区信息,包括在datetime
构造函数中传递它并使用日期时间(它似乎不会被生成的COM绑定自动转换)。
另一种方法是使用显式时间戳,从xml解析它们,但那些使用<script type="text/javascript">
function burgersub(){
if(document.getElementById("burg").value - 1 < 0)
return;
else
document.getElementById("burg").value--;
}
function burgeradd(){
var quantity = document.getElementById("quantity").value++;
quantity++;
var price = document.getElementById("price").value;
alert(quantity);
if (price) {
document.getElementById("burg").value = price * quantity;
}
}
</script>
p><button class="btn btn-default" onclick="burgeradd()">+</button><button class="btn btn-default" onclick="burgersub()">-</button></p>
<input readonly="yes" class="form-control" id="quantity" placeholder="Quantity">
<input readonly="yes" class="form-control" id="burg" placeholder="Amount">
<input class="form-control" id="price" placeholder="Price">
模块有问题的毫秒。
如何构造有效的时间类型零以传递给COM接口?在MATLAB中,我可以传递一个文字0。
编辑:我知道这个git repo及相关代码和网上的几篇博文。代码也使用文字0调用onenote COM,但是我无法使软件包甚至加载COM接口。编辑2:我运行了onepy并且遇到了同样的问题。
答案 0 :(得分:1)
这个问题在此期间已经过时了,但是我想展示一个有效的解决方案,我在试图找到类似的东西时发现了这个解决方案。问题是您需要一个时区感知日期才能在其上调用astimezone()
,这就是API出于某种原因所做的事情。要创建时区感知日期,您必须先将其本地化。例如,您可以按如下方式修改代码:
import datetime
import pytz
...
date = pytz.utc.localize(datetime.datetime(year = 1899, month = 12, day = 30))
oneNoteApp.UpdatePageContent(soup, date)
实际问题是提交一个合适的日期传递给UpdatePageContent()
。我的答案中的奇怪选择是详细here。