5

我正在尝试编写一个 python 脚本,从 ISI Web of Science 检索有关出版物的信息。我在 GitHub 上找到了 domoritz 的 python 脚本wos.py。它使用 Suds 连接到 ISI Web of Science 网络服务。我已将它导入到我的 python 脚本中,并按照评论中非常简短的说明尝试了此代码:

from wos import *
soap = WokmwsSoapClient()
results = soap.search('Hallam')

然后我得到一个错误:

suds.WebFault: Server raised fault: 'line 1:1: unexpected token: Hallam'

我查看了 wos.py 中的代码。这是search功能:

def search(self, query):
    qparams = {
        'databaseID' : 'WOS',
        'userQuery' : query,
        'queryLanguage' : 'en',
        'editions' : [{
            'collection' : 'WOS',
            'edition' : 'SCI',
        },{
            'collection' : 'WOS',
            'edition' : 'SSCI',
        }]
    }

    rparams = {
        'count' : 5, # 1-100
        'firstRecord' : 1,
        'fields' : [{
            'name' : 'Relevance',
            'sort' : 'D',
        }],
    }

    return self.client['search'].service.search(qparams, rparams)

我想也许query不能只是一个普通的 python 字符串,就像我在WSDL页面中看到的那样,userQuery它实际上是 type xs:string。但是这个页面userQuery“必须是一个有效的 WOKQL 查询语句。这个要求是在内部强制执行的”,这使得我看起来不需要传入一个特殊的类型。无论如何,我尝试附加'xs:string'到查询的开头,但我得到了同样的错误。

有人知道使用这种方法的正确方法吗?

4

2 回答 2

4

您可以尝试使用Wos Python Client可以安装的:

pip install wos

然后你可以像这样使用它:

from wos import WosClient
import wos.utils

with WosClient('JohnDoe', '12345') as client:
    print(wos.utils.query(client, 'AU=Knuth Donald'))

您还可以使用 CLI 工具,例如:

wos -u 'JohnDoe' -p '12345' query 'AU=Knuth Donald'

*免责声明:我不为 Web of Science 工作,但我是客户端的作者。由于 Web of Science 不允许来自普通用户的 Web 服务请求,因此您需要访问 Web 服务(这是除了正常 WOS 访问之外的一项付费服务​​)。您应该要求您的大学向您提供 WOS 给他们的用户名和密码。这不仅适用于我的客户,也适用于任何使用 WOS Web 服务的东西。*

于 2016-06-10T07:45:33.057 回答
1

所以显然传入一个python字符串很好,但我需要一个更像搜索查询的字符串。我在之前提到的网站上找到了这个例子:

<soap:Body>
  <woksearch:search xmlns:woksearch="http://woksearch.v3.wokmws.thomsonreuters.com">
  <!--  this request has the minimum required elements, 
      but contains all valid retrieve options 
      for this operation and databaseId -->
  <queryParameters>
     <databaseId>WOK</databaseId> 
     <userQuery>AU=Arce, G*</userQuery>      
     <queryLanguage>en</queryLanguage> 
  </queryParameters>
....

所以我尝试使用results = soap.search('AU=Hallam')并且有效。我现在可以做类似的事情print results.recordsFound并且我得到正确的答案。

于 2013-03-15T17:25:44.217 回答