This is my lesson notes for the workshop. So I'll be adding mostly code examples with some short narrative to keep me on track, but this isn't being written to be a solo document.

Block 1: Intro and why are you here

  • 2 min bios
    • Name, instrutution, and why you are here
  • 5 min free writing
    • Why are you here and what are you projects?

Block 2: Installation of Python discussion

  • Anaconda
  • PyCharm
  • What is each and why you might choose?

Anyone want to do something else? We can likely deal.

Block 3: Brief review of Python syntax

This will likely be determined by what the group knows.

  • Strings
  • Numbers
  • Data collections
    • lists
    • dictionaries
  • list methods
  • common dictionary methods

Block 4: Bio/Coffee break 10:50 - 11:00

Block 5: What really is automation?

First question: what really is anything on a computer?

Think text

  • What are file paths? Text.
  • What are file names? Text.
  • What's data? A lot of text.
  • What's a command line argument? Text.
  • What are URLS? Text.
  • What are webpages? Text and friends.

Three steps to any automation task:

  1. Gather all the stuff you need to do things to
  2. Feed those things into what you need to do
  3. Output all the things

Use string manipulation in Python allows you to build stuff

Life is one big mad lib and so is your data.

So what kind of automation tasks that you need to do?

Think less pure automation, and how you can go with a computer assisted task.

String stuff in Python: let's get comfy with this

  • Quotes can be single or double, they just have to match.
    • 'yup'
    • "yup"
  • There's also triple quotes that allow you to include rendered hard returns (versus \n) in your string. This is also sometimes used for documentation and other items in your script. The quotes can also be single or double, they just have to match
    • '''yup
      yup'''
      
    • """yup
      yup"""
      

Concatenation

Is the verb in question here. This smashes two strings together to create a new string.

Important technical detail: strings are immutable. This meants that when you start messing with strings, Python will always return back to you a new string in memory. So it completely valid to mess with a string out in the ether of the program, but you'll need to use an assignment statement to catch the new value.

  • Use the + sign to concatenate two strings together

A note on print(): yes you can use print(str, str, str) and it will put a space in there for you, but that space only appears in your output. It doesn't exist in memory to be used later.

In [1]:
thing1 = "school"
thing2 = "bus"

print(thing1 + thing2)
schoolbus

That looks good, but I need a space between them!

In [2]:
print(thing1 + " " + thing2)
school bus

In this example we've mixed in variables containing strings with literal strings. Python doesn't care! The variables hold the string data types that were part of their assignment, so Python really doesn't see a difference between them.

Here we can do a little mad lib thing.

In [7]:
animal_singular = "tuatara"
animal_plural = "tuataras"
mode_of_transit = "bus"
verb = "lick"

base = "Does your " + animal_singular + " " + verb + " many interesting " \
        + animal_plural + " on the " + mode_of_transit + "?"
    
print(base)
Does your tuatara lick many interesting tuataras on the bus?

Things to note:

  • I needed to hard code the spaces in there
  • I used \ to wrap my long string in there
  • I used a combination of strings and variables of strings, with + between each to concat them.
  • I saved this to a string so I have saved the value.
  • You can't tell where the variable values came in
  • I have combined many objects into a single object, my new string

Activity: Break into pairs. Each person independently writes a madlib (be funny but respectful!) and then prompts the other for the answers.

More advanced looping

So we should already be a bit femiliar with a for loop in Python. But let's revisit the basics again.

In [9]:
colors = ['red', 'green', 'blue']

for name in colors:
    print("I like " + name)
I like red
I like green
I like blue

In this way, we can provide a series of values to loop over, repeating a task. I'm not doing much of interest here, but we can look at more complex data strucure. The list of lists.

Say that I have a list containing all 4 of my madlib values.

In [11]:
answers = ['tuatara', 'tuataras', 'bus', "lick"]

You'll note here:

  • the square brackets surrounding my content mean I'm working with a list
    • versus when you see [] directly to the right of something that's a data extraction notation
  • each element is separated by a comma, and the comma is outside/between the quotes
  • each element is a string, and we know they are strings because of the quotes. I could have other data types in here if I wanted, but I'm working all with strings because that's my data. I only need quotes because I'm working with strings.
  • that I'm mixing my use of single and double quotes, and python doesn't care (so long as they balance around the individual strings)
  • each comma is followed by a white space, which is not required by Python, but I prefer for reabability
  • I'm using a single equal sign for an assignment
  • like my commas, there are white spaces surrounding the =, which is personal preference for readability
  • my list variable name is plural, which is a personal style choice

Let's say now that we collect multiple responses.

In [12]:
person1 = ['tuatara', 'tuataras', 'bus', "lick"]
person2 = ['cat', 'cats', 'car', 'purr']
person3 = ['sloth', 'sloth', 'sleigh', 'sleep']

We can use these individual variables one at a time, but that won't serve us very well if we want to loop over them or are constructing them from a data file. In fact, there's very little useful about having all three of these stored in different variables.

Instead, we can think: what's a data structure useful for collecting up things? A list!

So we can make a list of lists. We could define it as such: all_answers = [person1, person2, person3]

But instead we'll use a base pattern that you're more likely to use, a list accumulator. Imagine that you are looping over a data file and collecting these values. You'll need to add those values to the end of that list, one by one.

We aren't looping over things, but we can still use the right methods for the job.

In [13]:
answers = []
answers.append(person1)
answers.append(person2)
answers.append(person3)

print(answers)
[['tuatara', 'tuataras', 'bus', 'lick'], ['cat', 'cats', 'car', 'purr'], ['sloth', 'sloth', 'sleigh', 'sleep']]

Let's talk about append

Method summary: list_that_exists.append(thing_to_add_to_it)

  • unlike strings, lists can be mutated under foot
  • so the object that you've given a variable name to can be changed without a reassignment statement
  • append does not return a new list back to you. It changes the list in question to add stuff to it.
  • the list you want to have the thing comes before append, and the thing you want to go into

Let's talk about this data structure for a minute.

  • the outer list has a length of 3, becasue there are three lists in there.
  • even though those lists all have many strings in them, the individual lists only count as one object
  • each list holds 4 strings, and this is by design and choice. You could have lists of differing lengths and of differing data types.
  • any value of having the variable name labels is now lost, we will have to depend on just the position numbers to be consistant. Again, this isn't Python enforcing this, this is us creating and sticking to our own rules.

So now when we iterate over it:

In [14]:
for one_group in answers:
    print(one_group)
['tuatara', 'tuataras', 'bus', 'lick']
['cat', 'cats', 'car', 'purr']
['sloth', 'sloth', 'sleigh', 'sleep']

A good question will be: we've got these values in there, how can we get them out in an orderly way and smash them back into our madlib?

Well, the multiassignment comes in pretty handy for that.

This allows you to specify multiple variable names for assignment. You must have a matching number of things for this version of the syntax to work. So if you have two variables listed on th left of =, you need to have two unpackable values on the right. There are several ways to make this work, and you may have seen this in a few other contexts. But we're going to go with a list pattern.

Remember our orignal variable names?

animal_singular = "tuatara"
animal_plural = "tuataras"
mode_of_transit = "bus"
verb = "lick"

We now have a list of just the values, but we can unpack those values. Remember that when we iterate over the list of lists, out iterable variable will contain the lists with those strings, one at a time.

In [16]:
animal_singular, animal_plural, mode_of_transit, verb = ['cat', 'cats', 'car', 'purr']

Let's print those out and check out work.

In [17]:
print(animal_singular, animal_plural, mode_of_transit, verb)
cat cats car purr

We've got two things:

  1. a way to contain all out instances of data in one list (which we already know we can loop over)
  2. a way to unpack all the values form those instances of data as we are looping over it

Let's put it together.

In [18]:
for one_group in answers: # just the basic for loop
    print(one_group)
['tuatara', 'tuataras', 'bus', 'lick']
['cat', 'cats', 'car', 'purr']
['sloth', 'sloth', 'sleigh', 'sleep']

Remember now that our iterable variable holds those individual lists, so don't see one_group, try to see those lists of 4 strings.

In [20]:
for one_group in answers:
    animal_singular, animal_plural, mode_of_transit, verb = one_group
    print(animal_singular, animal_plural, mode_of_transit, verb)
tuatara tuataras bus lick
cat cats car purr
sloth sloth sleigh sleep
In [21]:
# now add the madlibs in!

for one_group in answers:
    animal_singular, animal_plural, mode_of_transit, verb = one_group
    print("Does your " + animal_singular + " " + verb + " many interesting " \
        + animal_plural + " on the " + mode_of_transit + "?")
Does your tuatara lick many interesting tuataras on the bus?
Does your cat purr many interesting cats on the car?
Does your sloth sleep many interesting sloth on the sleigh?

section wrap up

What lingering questions do you have about this and any other python syntax?

Block 6: GitHub for solo projects

do the thing in the other repo

Block 7: Lunch!

Block 8: Data management protips

slide deck party parrot

Block 9: Reading and writing files

  • Using glob module to gather a list file names
  • Looping over a list of file paths to act on those files
  • Fun os module protips (copy, move, rename, etc).
  • String manipulation and constructing lists of file names
  • Looping over lists of file paths and writing files

Using glob

Getting file names can be rough, but it doesn't have to be. There are ways to have a bit more control over this, but one of the simplest ways of getting file paths out is the glob module.

You need to first bring the glob module into our workspace. Canonically, this is done with a base import statement.

In [1]:
import glob

Now that the module is imported, we can use out dot notation to use functions that live inside it. The main function that you'll want to use is called glob(). This means that we need to use glob.glob() to make it run.

This function takes a single string argument. The advantage of this function is that you can give it a string value of a unix path search. This will search and give you back a list of strings, each representing the relative path for that file from your current working directory. While this wonk't to recursively look inside folders, it does keep your code tidy and flexible.

Don't worry if you don't know these too well! Here are some basics:

  • * will act like a wildcard and get everything within that folder
  • *.txt will grab all the text files, etc.
  • You can put unix valid regex in here as well

We'll be using a folder of some old screen shots. This lives in a folder that is in the same directory of my script. So I can specify my folder name and then say * to get all the files in there.

In [7]:
import glob

shots = glob.glob('ScreenShots/*')

Looping over a list of files to open them

So we have screen shots here, let's loop through our file names and try to collect some system metadata about it.

File paths need only be a string here, so we have a list of valid paths and that's totally fine for out purposes.

In [9]:
import os

for file in shots:
    print(os.path.getsize(file))
18685
74553
30227
327221
86864
32314
63389
201330
42612
12440
65690
36521
34697
70671
9551
198167
37462
45865
45677
66086
139650
87697
11013
565384
119146
59566
24117
23707
297227
288833
285243
267300
57698
84352
166745
52660
1643261
1097026
2069808
55132
45882
1060670
42098
20338
45243
25295
220507
234150
61777
42453
14934
617248
294610
180824

Likewise, what if we had text and wanted to open the files? Same process. We can look at how many characters are in that file.

In [12]:
chapters = glob.glob('Dracula/*.txt')

for chap_path in chapters:
    with open(chap_path, 'r') as fin:
        print(len(fin.read()), "characters")
30778 characters
31004 characters
27115 characters
38109 characters
34585 characters
32866 characters
29972 characters
24037 characters
29548 characters
36076 characters
29613 characters
28669 characters
31510 characters
32320 characters
28248 characters
29729 characters
32463 characters
33077 characters
37765 characters
40984 characters
30084 characters
30859 characters
18157 characters
29776 characters
30936 characters
33191 characters
30664 characters

Copying and moving files

Sometimes you want to move files or copy them over. There are things for that in the os. There are many here, so it is worth readin through some of the options if you need to actually do these things. Importantly, some of these functions will preserve the access/creation metadata and others won't.

We're going to start messing with the screen shot files, so let's go ahead and copy them over to a new folder.

There are a few tasks here that we might want to do:

  • check if a folder/path currently exists
  • make it if it doesn't
  • make copies of all the files in one folder to another

These things all exist in separate utilities, so we'll have to do some more serious imports.

Let's set up a plan here:

  • (import all the things)
  • check if the folder name we want exists
  • make the folder if not
  • get the file paths and replace the old folder name with the new folder name
  • loop over the file paths
  • in the loop, copy the file
In [21]:
# import all the things first, these should be on separate lines
# there are other ways of importing things
# and some modules have different traditions of how to make imports
# always match the traditional style of your community

import os
import os.path
import shutil
import glob

oldfolder = "ScreenShots"
newfolder = "ScreenShotsReorg"

file_paths = glob.glob(oldfolder + '/*.png')

if os.path.isdir(newfolder + "/"):
    print("Folder already exists")
else:
    print("Folder doesn't exist. Making one.")
    os.mkdir(newfolder + '/')
    
for old_path in file_paths:
    new_path = old_path.replace(oldfolder, newfolder)
    shutil.copy(old_path, new_path)
    print("copy completed for", new_path)
Folder already exists
copy completed for ScreenShotsReorg/Screen Shot 2017-07-21 at 2.51.08 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-07-27 at 7.03.27 AM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-08-18 at 9.10.49 AM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-08-21 at 2.06.37 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-08-21 at 4.20.21 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-08-31 at 3.36.22 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-09-05 at 4.45.45 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-09-28 at 2.07.12 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-10-02 at 1.54.03 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-10-06 at 2.01.15 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-10-11 at 1.49.13 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-10-16 at 3.17.53 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-10-22 at 9.19.37 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-10-23 at 9.46.51 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-10-26 at 3.27.19 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-10-30 at 5.43.32 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-02 at 4.00.26 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-07 at 2.22.10 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-09 at 11.31.12 AM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-14 at 7.54.49 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-15 at 11.06.09 AM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-24 at 1.55.53 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-28 at 1.48.20 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-29 at 2.54.40 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-29 at 2.55.25 PM copy.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-30 at 12.44.58 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-30 at 12.45.13 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-11-30 at 12.45.23 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-12-08 at 3.43.25 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-12-08 at 3.52.46 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-12-08 at 3.59.28 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-12-08 at 4.08.12 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-12-08 at 4.11.25 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-12-08 at 4.12.15 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2017-12-08 at 4.14.27 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-01-02 at 2.07.56 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-01-02 at 7.35.30 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-01-02 at 7.35.41 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-01-02 at 7.35.44 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-01-25 at 1.47.44 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-02-05 at 11.40.57 AM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-02-08 at 10.14.47 AM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-02-14 at 1.31.50 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-02-22 at 2.31.18 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-02-23 at 9.17.10 AM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-02-26 at 8.24.36 AM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-03-03 at 2.06.04 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-03-23 at 9.14.37 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-03-23 at 9.17.14 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-03-23 at 9.38.45 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-03-23 at 9.52.31 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-03-31 at 2.38.54 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-04-03 at 3.33.14 PM.png
copy completed for ScreenShotsReorg/Screen Shot 2018-04-03 at 4.37.48 PM.png
  • We have generated file paths
  • looped over them
  • changed the paths on the fly using stock string methods
  • used that new path to write out a new file

Block 10: Bio/break 2:30-2:45

Block 11: Working with APIs

  • Downloading websites with a given URL
  • Using predictable patterns to construct URLs for downloading
    • Single pages
    • Page ranges (e.g. parsing through a list of search results)
  • Discussion: what have you tried or wanted to try before?

this is all still just text

APIs are nifty and using them is often another matter of manupilating text.

Every one will work a bit differently, so you'll need to wrap your head around how that one wants you to put in text. This is how you should be reading the documentation.

Let's play with one that:

  • doesn't want a log in to mess with
  • isn't super restricted
  • can handle a load

Once you know how to craft the queries, you can use python to make it happen. These queries are really just URLs with other information in them. You'll use string methods to construct those URLs and then throw them to Python for evaluation.

before you start anything, you need to know:

  • are there any restrictions on how many times I can hit their servers?
  • what delay should you have between these requests
  • how should the URLs be constructed?

DataCite

This is a service that deals with DOIs for datasets. I don't want to get too much into the weeds about this because it isn't important. What you need to know is that they also have an API to query and serve up metadata records about those datasets.

Let's write a program that takes in a search term and gets all the data records out of it.

We aren't going to be focusing too much on how they work because every API works differently.

What's the end point?

Here's how this one works:

  • There's a base URL that you can plunk in a query text and it'll serve up results, but the pages will be numbered.
  • It'll serve it up via json, and the metadata xml payload will be there as base64.
  • It'll also state which page we're on and how many pages there are.
  • We want to hit their servers as litle as possible, so we'll need to grab the results pages and then get the metadata out from our local copies.

We're going to use two packages that will be new to us:

  1. requests to download the urls
  2. json to work with the data being served to us to get a few points of information out

Getting just one page

The first step here is just to get one page into memory. Websites are usually just text, or at least what's being served to you is text. So we have a choice: we can keep it in memory or we can write it out to a file.

We'll start with keeping it in memory as a string. Once we have the data as a string we can pass it into something to parse it. For example, sometimes it'll be JSON or XML data, and while that's just a plain text file (and thus can be stored as a string), the string structure doesn't know the ins and outs of that data format. Meaning that while we can see it, write it, and manipulate it as text, we can't query it with that data format's native methods.

There are special considerations for if you need to deal with a page or API that requires a key or password, which will not be covered here. However, you'll still have to deal with all this stuff in the process.

Getting it into memory

We're going to use the requests module, which is not part of the standard library, but is one of the gold standard packages for dealing with this stuff and should come with your normal anaconda installer.

There are two phases here:

  1. Have requests make a connection to that website.
  2. Extract what you want out of there.

There are nice ways to check the status codes and other HTTPish things, but we're going to focus on grabbing the results first.

We'll use a loren ipsum API to play with first to get the hang of getting stuff back from requests, and then we'll play with DataCite.

We'll want to use this URL: https://loripsum.net/api/1/plaintext/short

Broken down, this URL will be giving us 1 short paragraph formatted in plain text. You can read about the options here: https://loripsum.net/ They have a system where you can play with all the options and see the results.

This gives plain text back. Let's first get that to print out.

Making the request

Before you do anything you must import the requests module.

In [48]:
import requests

Now we can make out first request. We need to provide it a URL and it will give us back a requests connection object, that we can later ask for more information.

In [51]:
import requests

url = "https://loripsum.net/api/1/plaintext/short"
result = requests.get(url)

print(result)
<Response [200]>

So what we're seeing here is a sucessfull connection, but not the text. We have to ask about that explicitly from out result object.

We do this with .text (no parens!) this will allow us to ask for a variable value within out object (versus calling a function). Some objects just work this way, and we know how to do this by looking at the documentation or a tutorial.

In [52]:
print(result.text)
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Primum in nostrane potestate est, quid meminerimus? Primum in nostrane potestate est, quid meminerimus? 


Cool! We can play with constructing URLs in a loop here.

This tool allows you to specify some parameters in the URL, separated by / characters. Options include having it be short, medium, long, verylong. Let's loop through these options and look at what's returned. Since we'll be making multiple calls, we also need to add a time delay.

In [55]:
import requests
import time

options = ['short', 'medium', 'long', 'verylong']

for length in options:
    print("here's", length)
    url = "https://loripsum.net/api/1/plaintext/" + length
    result = requests.get(url)
    print(result.text)
    time.sleep(2)S
here's short
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Summum a vobis bonum voluptas dicitur. In schola desinis. Num quid tale Democritus? Omnis enim est natura diligens sui. Stoicos roga. Cum audissem Antiochum, Brute, ut solebam, cum M. Sed ille, ut dixi, vitiose. Haec igitur Epicuri non probo, inquam. 


here's medium
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quare obscurentur etiam haec, quae secundum naturam esse dicimus, in vita beata; Expectoque quid ad id, quod quaerebam, respondeas. Sed ad bona praeterita redeamus. Atqui reperies, inquit, in hoc quidem pertinacem; Et quidem iure fortasse, sed tamen non gravissimum est testimonium multitudinis. Duo Reges: constructio interrete. Hoc est vim afferre, Torquate, sensibus, extorquere ex animis cognitiones verborum, quibus inbuti sumus. 


here's long
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Alia quaedam dicent, credo, magna antiquorum esse peccata, quae ille veri investigandi cupidus nullo modo ferre potuerit. Isto modo ne improbos quidem, si essent boni viri. Quid enim ab antiquis ex eo genere, quod ad disserendum valet, praetermissum est? Intellegi quidem, ut propter aliam quampiam rem, verbi gratia propter voluptatem, nos amemus; Ex ea difficultate illae fallaciloquae, ut ait Accius, malitiae natae sunt. Duo Reges: constructio interrete. Omnes, qui non sint sapientes, aeque miseros esse, sapientes omnes summe beatos, recte facta omnia aequalia, omnia peccata paria; Quem Tiberina descensio festo illo die tanto gaudio affecit, quanto L. 


here's verylong
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nec enim absolvi beata vita sapientis neque ad exitum perduci poterit, si prima quaeque bene ab eo consulta atque facta ipsius oblivione obruentur. Quare istam quoque aggredere tractatam praesertim et ab aliis et a te ipso saepe, ut tibi deesse non possit oratio. 


As you can see here, the URL is a string, so we can use string methods to change it as part of an iteration.

There are other times when a URL has numbers in it, such as a page number, that you need to loop through. In these cases, you can generate the numbers that you want from a for loop, recast them to a string, and then add them to the URL string that you need.

For example:

In [57]:
for i in range(1, 6):
    print("http://www.something.com/page=" + str(i))
http://www.something.com/page=1
http://www.something.com/page=2
http://www.something.com/page=3
http://www.something.com/page=4
http://www.something.com/page=5

Let's change gears and take a look at the DataCite API.

Here's an example search: https://search.datacite.org/works?query=tuatara

This gives you two pages of results, and when we click on the the next page, the URL reveals to us the page number structure.

So here's page 2's url: https://search.datacite.org/works?query=tuatara&page=2

So we can try changing that 2 to 1: https://search.datacite.org/works?query=tuatara&page=1 and see if that indeed gives us the first page of results.

So if look at a larger search: https://search.datacite.org/works?query=snake

We can look at how many pages there are, and at the bottom of the page it looks like the last one is page 40. Let's try going there. Indeed that looks right.

So how do we generate these 40 URLs? Well, let's think: how can we generate the numbers 1-40?

  • range(1, 41) will do that.
In [59]:
for i in range(1, 41):
    print("https://search.datacite.org/works?query=snake&page=" + str(i))
https://search.datacite.org/works?query=snake&page=1
https://search.datacite.org/works?query=snake&page=2
https://search.datacite.org/works?query=snake&page=3
https://search.datacite.org/works?query=snake&page=4
https://search.datacite.org/works?query=snake&page=5
https://search.datacite.org/works?query=snake&page=6
https://search.datacite.org/works?query=snake&page=7
https://search.datacite.org/works?query=snake&page=8
https://search.datacite.org/works?query=snake&page=9
https://search.datacite.org/works?query=snake&page=10
https://search.datacite.org/works?query=snake&page=11
https://search.datacite.org/works?query=snake&page=12
https://search.datacite.org/works?query=snake&page=13
https://search.datacite.org/works?query=snake&page=14
https://search.datacite.org/works?query=snake&page=15
https://search.datacite.org/works?query=snake&page=16
https://search.datacite.org/works?query=snake&page=17
https://search.datacite.org/works?query=snake&page=18
https://search.datacite.org/works?query=snake&page=19
https://search.datacite.org/works?query=snake&page=20
https://search.datacite.org/works?query=snake&page=21
https://search.datacite.org/works?query=snake&page=22
https://search.datacite.org/works?query=snake&page=23
https://search.datacite.org/works?query=snake&page=24
https://search.datacite.org/works?query=snake&page=25
https://search.datacite.org/works?query=snake&page=26
https://search.datacite.org/works?query=snake&page=27
https://search.datacite.org/works?query=snake&page=28
https://search.datacite.org/works?query=snake&page=29
https://search.datacite.org/works?query=snake&page=30
https://search.datacite.org/works?query=snake&page=31
https://search.datacite.org/works?query=snake&page=32
https://search.datacite.org/works?query=snake&page=33
https://search.datacite.org/works?query=snake&page=34
https://search.datacite.org/works?query=snake&page=35
https://search.datacite.org/works?query=snake&page=36
https://search.datacite.org/works?query=snake&page=37
https://search.datacite.org/works?query=snake&page=38
https://search.datacite.org/works?query=snake&page=39
https://search.datacite.org/works?query=snake&page=40

Once you can generate these urls, you can send them through requests to get the data.

The next progrgamming chunk that we will be covering will be working with JSON and getting the data out of it. We can change part of the URL to grab the JSON output.

In [63]:
for i in range(1, 41):
    print("https://api.datacite.org/works?query=snake&page=" + str(i))
https://api.datacite.org/works?query=snake&page=1
https://api.datacite.org/works?query=snake&page=2
https://api.datacite.org/works?query=snake&page=3
https://api.datacite.org/works?query=snake&page=4
https://api.datacite.org/works?query=snake&page=5
https://api.datacite.org/works?query=snake&page=6
https://api.datacite.org/works?query=snake&page=7
https://api.datacite.org/works?query=snake&page=8
https://api.datacite.org/works?query=snake&page=9
https://api.datacite.org/works?query=snake&page=10
https://api.datacite.org/works?query=snake&page=11
https://api.datacite.org/works?query=snake&page=12
https://api.datacite.org/works?query=snake&page=13
https://api.datacite.org/works?query=snake&page=14
https://api.datacite.org/works?query=snake&page=15
https://api.datacite.org/works?query=snake&page=16
https://api.datacite.org/works?query=snake&page=17
https://api.datacite.org/works?query=snake&page=18
https://api.datacite.org/works?query=snake&page=19
https://api.datacite.org/works?query=snake&page=20
https://api.datacite.org/works?query=snake&page=21
https://api.datacite.org/works?query=snake&page=22
https://api.datacite.org/works?query=snake&page=23
https://api.datacite.org/works?query=snake&page=24
https://api.datacite.org/works?query=snake&page=25
https://api.datacite.org/works?query=snake&page=26
https://api.datacite.org/works?query=snake&page=27
https://api.datacite.org/works?query=snake&page=28
https://api.datacite.org/works?query=snake&page=29
https://api.datacite.org/works?query=snake&page=30
https://api.datacite.org/works?query=snake&page=31
https://api.datacite.org/works?query=snake&page=32
https://api.datacite.org/works?query=snake&page=33
https://api.datacite.org/works?query=snake&page=34
https://api.datacite.org/works?query=snake&page=35
https://api.datacite.org/works?query=snake&page=36
https://api.datacite.org/works?query=snake&page=37
https://api.datacite.org/works?query=snake&page=38
https://api.datacite.org/works?query=snake&page=39
https://api.datacite.org/works?query=snake&page=40

Now we can use the i in our loop to help make file names.

In [71]:
import time

folder = "results/"

for i in range(1, 41):
    filename = folder + "result_page_" + str(i) + ".json"
    result = requests.get("https://api.datacite.org/works?query=snake&page[number]=" + str(i))
    print(result)
    with open(filename, 'w') as fout:
        fout.write(result.text)
    time.sleep(2)
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>
<Response [200]>

In this way we are hard coding how many pages there are, which might be completely fine for our purposes.

Block 12: Discussion

Do you have any new ideas on your projects? How have these things changed for you?

Anything close? Too far away?

Block 13: Project planning workflow activity

Workflow workshop!

That might be enough coding for one day. Let's think more about the projects at hand.

DAY 2

Data reading and other tool tour

  • Working with CSVs
  • Working with json data
  • XPath
  • Regular expressions

Working with JSON

Let's open up a json file that we just downloaded. We will want to use the json module built into Python.

Here's the basic way to read in a JSON file:

In [72]:
import json

with open('results/result_page_1.json', 'r') as fin:
    data = json.load(fin)

Things to note here is that we need to pass json.load() a json file opened for reading, but there is no .read etc. It will parse it out and then give you a json object.

Working with json is much like a dictionary in python. There are keys and values. One way to get a sense of the structure is to try and loop through it.

In [76]:
print(data)
{'data': [{'id': 'https://doi.org/10.4225/72/570d1ead85f29', 'type': 'works', 'attributes': {'doi': '10.4225/72/570d1ead85f29', 'identifier': 'https://doi.org/10.4225/72/570d1ead85f29', 'url': None, 'author': [{'literal': 'Don Daniels'}], 'title': 'Snake', 'container-title': 'PARADISEC', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'ands.centre72', 'member-id': 'ands', 'resource-type-id': None, 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2016', 'registered': '2016-04-12T16:13:38Z', 'checked': None, 'updated': '2016-04-12T16:13:38Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxyZXNvdXJjZSB4bWxucz0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMgaHR0cDovL3NjaGVtYS5kYXRhY2l0ZS5vcmcvbWV0YS9rZXJuZWwtMy9tZXRhZGF0YS54c2QiPjxpZGVudGlmaWVyIGlkZW50aWZpZXJUeXBlPSJET0kiPjEwLjQyMjUvNzIvNTcwRDFFQUQ4NUYyOTwvaWRlbnRpZmllcj48Y3JlYXRvcnM+PGNyZWF0b3I+PGNyZWF0b3JOYW1lPkRvbiBEYW5pZWxzPC9jcmVhdG9yTmFtZT48L2NyZWF0b3I+PC9jcmVhdG9ycz48dGl0bGVzPjx0aXRsZT5TbmFrZTwvdGl0bGU+PC90aXRsZXM+PHB1Ymxpc2hlcj5QQVJBRElTRUM8L3B1Ymxpc2hlcj48cHVibGljYXRpb25ZZWFyPjIwMTY8L3B1YmxpY2F0aW9uWWVhcj48Y29udHJpYnV0b3JzPjxjb250cmlidXRvciBjb250cmlidXRvclR5cGU9IkRhdGFDb2xsZWN0b3IiPjxjb250cmlidXRvck5hbWU+RG9uIERhbmllbHM8L2NvbnRyaWJ1dG9yTmFtZT48L2NvbnRyaWJ1dG9yPjxjb250cmlidXRvciBjb250cmlidXRvclR5cGU9IkRhdGFDb2xsZWN0b3IiPjxjb250cmlidXRvck5hbWU+VW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBTYW50YSBCYXJiYXJhPC9jb250cmlidXRvck5hbWU+PC9jb250cmlidXRvcj48L2NvbnRyaWJ1dG9ycz48cmVsYXRlZElkZW50aWZpZXJzPjxyZWxhdGVkSWRlbnRpZmllciByZWxhdGVkSWRlbnRpZmllclR5cGU9IkRPSSIgcmVsYXRpb25UeXBlPSJJc1BhcnRPZiI+MTAuNDIyNS83Mi81NkU4MjQ4NTYzRUUwPC9yZWxhdGVkSWRlbnRpZmllcj48L3JlbGF0ZWRJZGVudGlmaWVycz48L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'ands.centre72', 'type': 'data-centers'}}, 'member': {'data': {'id': 'ands', 'type': 'members'}}, 'resource-type': {'data': None}}}, {'id': 'https://doi.org/10.17863/cam.18284', 'type': 'works', 'attributes': {'doi': '10.17863/cam.18284', 'identifier': 'https://doi.org/10.17863/cam.18284', 'url': None, 'author': [{'given': 'Anton', 'family': 'Churyumov'}], 'title': 'Oleg Mandzhiev, How Kalmyks Trained Their Horses', 'container-title': 'Apollo - University of Cambridge Repository', 'description': 'Oleg talks about how Kalmyks trained their horses in the past. It is known that horses can see flying objects and that they are also afraid of snakes. Horse training was based on these two principles. When foals were in, children put snakes inside the enclosures so that the foals would get used to them. As foals grew up, snakes were chopped into small pieces and tied to arrows. Then the young horses were shot with these arrows. When horses saw arrows they jumped aside to avoid. In the past during battles Kalmyk warriors dropped their reins loose so that their horses could avoid arrows by themselves.', 'resource-type-subtype': 'Video', 'data-center-id': 'bl.cam', 'member-id': 'bl', 'resource-type-id': 'audiovisual', 'version': None, 'license': None, 'schema-version': '4', 'results': [], 'related-identifiers': [], 'published': '2016', 'registered': '2018-01-29T21:01:42Z', 'checked': None, 'updated': '2018-02-06T19:48:06Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxyZXNvdXJjZSB4bWxucz0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTQiIHhtbG5zOmRzcGFjZT0iaHR0cDovL3d3dy5kc3BhY2Uub3JnL3htbG5zL2RzcGFjZS9kaW0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTQgaHR0cDovL3NjaGVtYS5kYXRhY2l0ZS5vcmcvbWV0YS9rZXJuZWwtNC9tZXRhZGF0YS54c2QiPjxpZGVudGlmaWVyIGlkZW50aWZpZXJUeXBlPSJET0kiPjEwLjE3ODYzL0NBTS4xODI4NDwvaWRlbnRpZmllcj48Y3JlYXRvcnM+PGNyZWF0b3I+PGNyZWF0b3JOYW1lPkNodXJ5dW1vdiwgQW50b248L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48L2NyZWF0b3JzPjx0aXRsZXM+PHRpdGxlPk9sZWcgTWFuZHpoaWV2LCBIb3cgS2FsbXlrcyBUcmFpbmVkIFRoZWlyIEhvcnNlczwvdGl0bGU+PC90aXRsZXM+PHB1Ymxpc2hlcj5BcG9sbG8gLSBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBSZXBvc2l0b3J5PC9wdWJsaXNoZXI+PHB1YmxpY2F0aW9uWWVhcj4yMDE2PC9wdWJsaWNhdGlvblllYXI+PHN1YmplY3RzPjxzdWJqZWN0PkhvcnNlczwvc3ViamVjdD48c3ViamVjdD50cmFpbmluZzwvc3ViamVjdD48c3ViamVjdD5zbmFrZTwvc3ViamVjdD48c3ViamVjdD5mb2Fsczwvc3ViamVjdD48c3ViamVjdD5hcnJvd3M8L3N1YmplY3Q+PC9zdWJqZWN0cz48Y29udHJpYnV0b3JzPjxjb250cmlidXRvciBjb250cmlidXRvclR5cGU9IkRhdGFNYW5hZ2VyIj48Y29udHJpYnV0b3JOYW1lPkFwb2xsbyAtIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlIFJlcG9zaXRvcnk8L2NvbnRyaWJ1dG9yTmFtZT48L2NvbnRyaWJ1dG9yPjxjb250cmlidXRvciBjb250cmlidXRvclR5cGU9Ikhvc3RpbmdJbnN0aXR1dGlvbiI+PGNvbnRyaWJ1dG9yTmFtZT5BcG9sbG8gLSBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBSZXBvc2l0b3J5PC9jb250cmlidXRvck5hbWU+PC9jb250cmlidXRvcj48Y29udHJpYnV0b3IgY29udHJpYnV0b3JUeXBlPSJFZGl0b3IiPjxjb250cmlidXRvck5hbWU+Q2h1cnl1bW92YSwgRWx2aXJhPC9jb250cmlidXRvck5hbWU+PC9jb250cmlidXRvcj48L2NvbnRyaWJ1dG9ycz48ZGF0ZXM+PGRhdGUgZGF0ZVR5cGU9Iklzc3VlZCI+MjAxOC0wMS0yOTwvZGF0ZT48ZGF0ZSBkYXRlVHlwZT0iQXZhaWxhYmxlIj4yMDE4LTAxLTI5PC9kYXRlPjxkYXRlIGRhdGVUeXBlPSJJc3N1ZWQiPjIwMTYtMTAtMTA8L2RhdGU+PC9kYXRlcz48bGFuZ3VhZ2U+cnU8L2xhbmd1YWdlPjxyZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlR2VuZXJhbD0iQXVkaW92aXN1YWwiPlZpZGVvPC9yZXNvdXJjZVR5cGU+PGFsdGVybmF0ZUlkZW50aWZpZXJzPjxhbHRlcm5hdGVJZGVudGlmaWVyIGFsdGVybmF0ZUlkZW50aWZpZXJUeXBlPSJ1cmkiPmh0dHBzOi8vd3d3LnJlcG9zaXRvcnkuY2FtLmFjLnVrL2hhbmRsZS8xODEwLzI3MTMwNDwvYWx0ZXJuYXRlSWRlbnRpZmllcj48YWx0ZXJuYXRlSWRlbnRpZmllciBhbHRlcm5hdGVJZGVudGlmaWVyVHlwZT0iZG9pIj4xMC4xNzg2My9DQU0uMTgyODQ8L2FsdGVybmF0ZUlkZW50aWZpZXI+PC9hbHRlcm5hdGVJZGVudGlmaWVycz48ZGVzY3JpcHRpb25zPjxkZXNjcmlwdGlvbiBkZXNjcmlwdGlvblR5cGU9IkFic3RyYWN0Ij5PbGVnIHRhbGtzIGFib3V0IGhvdyBLYWxteWtzIHRyYWluZWQgdGhlaXIgaG9yc2VzIGluIHRoZSBwYXN0LiBJdCBpcyBrbm93biB0aGF0IGhvcnNlcyBjYW4gc2VlIGZseWluZyBvYmplY3RzIGFuZCB0aGF0IHRoZXkgYXJlIGFsc28gYWZyYWlkIG9mIHNuYWtlcy4gSG9yc2UgdHJhaW5pbmcgd2FzIGJhc2VkIG9uIHRoZXNlIHR3byBwcmluY2lwbGVzLiBXaGVuIGZvYWxzIHdlcmUgaW4sIGNoaWxkcmVuIHB1dCBzbmFrZXMgaW5zaWRlIHRoZSBlbmNsb3N1cmVzIHNvIHRoYXQgdGhlIGZvYWxzIHdvdWxkIGdldCB1c2VkIHRvIHRoZW0uIEFzIGZvYWxzIGdyZXcgdXAsIHNuYWtlcyB3ZXJlIGNob3BwZWQgaW50byBzbWFsbCBwaWVjZXMgYW5kIHRpZWQgdG8gYXJyb3dzLiBUaGVuIHRoZSB5b3VuZyBob3JzZXMgd2VyZSBzaG90IHdpdGggdGhlc2UgYXJyb3dzLiBXaGVuIGhvcnNlcyBzYXcgYXJyb3dzIHRoZXkganVtcGVkIGFzaWRlIHRvIGF2b2lkLiBJbiB0aGUgcGFzdCBkdXJpbmcgYmF0dGxlcyBLYWxteWsgd2FycmlvcnMgZHJvcHBlZCB0aGVpciByZWlucyBsb29zZSBzbyB0aGF0IHRoZWlyIGhvcnNlcyBjb3VsZCBhdm9pZCBhcnJvd3MgYnkgdGhlbXNlbHZlcy48L2Rlc2NyaXB0aW9uPjxkZXNjcmlwdGlvbiBkZXNjcmlwdGlvblR5cGU9Ik90aGVyIj5BcmNhZGlhPC9kZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9ucz48L3Jlc291cmNlPg0K'}, 'relationships': {'data-center': {'data': {'id': 'bl.cam', 'type': 'data-centers'}}, 'member': {'data': {'id': 'bl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'audiovisual', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7282/t3gb23fq', 'type': 'works', 'attributes': {'doi': '10.7282/t3gb23fq', 'identifier': 'https://doi.org/10.7282/t3gb23fq', 'url': None, 'author': [{'literal': 'No Name Supplied'}], 'title': 'Corn Snake', 'container-title': 'No Publisher Supplied', 'description': 'The fact sheets provide information regarding the 71 different species of reptiles and amphibians in New Jersey. The purpose of the fact sheets is to help residents and visitors identify the many species throughout the state.', 'resource-type-subtype': None, 'data-center-id': 'cdl.rutgers', 'member-id': 'cdl', 'resource-type-id': 'text', 'version': None, 'license': None, 'schema-version': '2.2', 'results': [], 'related-identifiers': [], 'published': '2002', 'registered': '2015-03-03T22:21:08Z', 'checked': None, 'updated': '2015-03-03T22:21:08Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMi4yIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0yLjIgaHR0cDovL3NjaGVtYS5kYXRhY2l0ZS5vcmcvbWV0YS9rZXJuZWwtMi4yL21ldGFkYXRhLnhzZCI+ICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43MjgyL1QzR0IyM0ZRPC9pZGVudGlmaWVyPiAgPGNyZWF0b3JzPiAgICA8Y3JlYXRvcj4gICAgICA8Y3JlYXRvck5hbWU+Tm8gTmFtZSBTdXBwbGllZDwvY3JlYXRvck5hbWU+ICAgIDwvY3JlYXRvcj4gIDwvY3JlYXRvcnM+ICA8dGl0bGVzPiAgICA8dGl0bGU+Q29ybiBTbmFrZTwvdGl0bGU+ICA8L3RpdGxlcz4gIDxwdWJsaXNoZXI+Tm8gUHVibGlzaGVyIFN1cHBsaWVkPC9wdWJsaXNoZXI+ICA8cHVibGljYXRpb25ZZWFyPjIwMDI8L3B1YmxpY2F0aW9uWWVhcj4gIDxyZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlR2VuZXJhbD0iVGV4dCIvPiAgPGRlc2NyaXB0aW9ucz4gICAgPGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uVHlwZT0iQWJzdHJhY3QiPlRoZSBmYWN0IHNoZWV0cyBwcm92aWRlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgNzEgZGlmZmVyZW50IHNwZWNpZXMgb2YgcmVwdGlsZXMgYW5kIGFtcGhpYmlhbnMgaW4gTmV3IEplcnNleS4gVGhlIHB1cnBvc2Ugb2YgdGhlIGZhY3Qgc2hlZXRzIGlzIHRvIGhlbHAgcmVzaWRlbnRzIGFuZCB2aXNpdG9ycyBpZGVudGlmeSB0aGUgbWFueSBzcGVjaWVzIHRocm91Z2hvdXQgdGhlIHN0YXRlLjwvZGVzY3JpcHRpb24+ICA8L2Rlc2NyaXB0aW9ucz48L3Jlc291cmNlPg=='}, 'relationships': {'data-center': {'data': {'id': 'cdl.rutgers', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7282/t3wq036b', 'type': 'works', 'attributes': {'doi': '10.7282/t3wq036b', 'identifier': 'https://doi.org/10.7282/t3wq036b', 'url': None, 'author': [{'literal': 'No Name Supplied'}], 'title': 'Queen Snake', 'container-title': 'No Publisher Supplied', 'description': 'The fact sheets provide information regarding the 71 different species of reptiles and amphibians in New Jersey. The purpose of the fact sheets is to help residents and visitors identify the many species throughout the state.', 'resource-type-subtype': None, 'data-center-id': 'cdl.rutgers', 'member-id': 'cdl', 'resource-type-id': 'text', 'version': None, 'license': None, 'schema-version': '2.2', 'results': [], 'related-identifiers': [], 'published': '2003', 'registered': '2015-03-03T22:24:03Z', 'checked': None, 'updated': '2015-03-03T22:24:03Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMi4yIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0yLjIgaHR0cDovL3NjaGVtYS5kYXRhY2l0ZS5vcmcvbWV0YS9rZXJuZWwtMi4yL21ldGFkYXRhLnhzZCI+ICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43MjgyL1QzV1EwMzZCPC9pZGVudGlmaWVyPiAgPGNyZWF0b3JzPiAgICA8Y3JlYXRvcj4gICAgICA8Y3JlYXRvck5hbWU+Tm8gTmFtZSBTdXBwbGllZDwvY3JlYXRvck5hbWU+ICAgIDwvY3JlYXRvcj4gIDwvY3JlYXRvcnM+ICA8dGl0bGVzPiAgICA8dGl0bGU+UXVlZW4gU25ha2U8L3RpdGxlPiAgPC90aXRsZXM+ICA8cHVibGlzaGVyPk5vIFB1Ymxpc2hlciBTdXBwbGllZDwvcHVibGlzaGVyPiAgPHB1YmxpY2F0aW9uWWVhcj4yMDAzPC9wdWJsaWNhdGlvblllYXI+ICA8cmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZUdlbmVyYWw9IlRleHQiLz4gIDxkZXNjcmlwdGlvbnM+ICAgIDxkZXNjcmlwdGlvbiBkZXNjcmlwdGlvblR5cGU9IkFic3RyYWN0Ij5UaGUgZmFjdCBzaGVldHMgcHJvdmlkZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIDcxIGRpZmZlcmVudCBzcGVjaWVzIG9mIHJlcHRpbGVzIGFuZCBhbXBoaWJpYW5zIGluIE5ldyBKZXJzZXkuIFRoZSBwdXJwb3NlIG9mIHRoZSBmYWN0IHNoZWV0cyBpcyB0byBoZWxwIHJlc2lkZW50cyBhbmQgdmlzaXRvcnMgaWRlbnRpZnkgdGhlIG1hbnkgc3BlY2llcyB0aHJvdWdob3V0IHRoZSBzdGF0ZS48L2Rlc2NyaXB0aW9uPiAgPC9kZXNjcmlwdGlvbnM+PC9yZXNvdXJjZT4='}, 'relationships': {'data-center': {'data': {'id': 'cdl.rutgers', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7282/t36d5t6m', 'type': 'works', 'attributes': {'doi': '10.7282/t36d5t6m', 'identifier': 'https://doi.org/10.7282/t36d5t6m', 'url': 'https://rucore.libraries.rutgers.edu/rutgers-lib/25574/', 'author': [{'literal': 'No Name Supplied'}], 'title': 'Snake Hunting', 'container-title': 'No Publisher Supplied', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'cdl.rutgers', 'member-id': 'cdl', 'resource-type-id': 'text', 'version': None, 'license': None, 'schema-version': '2.2', 'results': [], 'related-identifiers': [], 'published': '1907', 'registered': '2015-03-03T15:03:56Z', 'checked': None, 'updated': '2016-12-21T20:49:37Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMi4yIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0yLjIgaHR0cDovL3NjaGVtYS5kYXRhY2l0ZS5vcmcvbWV0YS9rZXJuZWwtMi4yL21ldGFkYXRhLnhzZCI+ICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43MjgyL1QzNkQ1VDZNPC9pZGVudGlmaWVyPiAgPGNyZWF0b3JzPiAgICA8Y3JlYXRvcj4gICAgICA8Y3JlYXRvck5hbWU+Tm8gTmFtZSBTdXBwbGllZDwvY3JlYXRvck5hbWU+ICAgIDwvY3JlYXRvcj4gIDwvY3JlYXRvcnM+ICA8dGl0bGVzPiAgICA8dGl0bGU+U25ha2UgSHVudGluZzwvdGl0bGU+ICA8L3RpdGxlcz4gIDxwdWJsaXNoZXI+Tm8gUHVibGlzaGVyIFN1cHBsaWVkPC9wdWJsaXNoZXI+ICA8cHVibGljYXRpb25ZZWFyPjE5MDc8L3B1YmxpY2F0aW9uWWVhcj4gIDxyZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlR2VuZXJhbD0iVGV4dCIvPjwvcmVzb3VyY2U+'}, 'relationships': {'data-center': {'data': {'id': 'cdl.rutgers', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7299/x7g15xzk', 'type': 'works', 'attributes': {'doi': '10.7299/x7g15xzk', 'identifier': 'https://doi.org/10.7299/x7g15xzk', 'url': 'http://arctos.database.museum/media/10000928', 'author': [{'literal': 'Tracy I. Storer'}], 'title': 'Rubber Snake', 'container-title': 'Museum of Vertebrate Zoology', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'cdl.ucbmvz', 'member-id': 'cdl', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1912', 'registered': '2013-04-10T02:39:07Z', 'checked': None, 'updated': '2016-06-18T01:31:30Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIKICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMKICAgIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj4KICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43Mjk5L1g3RzE1WFpLPC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+VHJhY3kgSS4gU3RvcmVyPC9jcmVhdG9yTmFtZT4KICAgIDwvY3JlYXRvcj4KICA8L2NyZWF0b3JzPgogIDx0aXRsZXM+CiAgICA8dGl0bGU+UnViYmVyIFNuYWtlPC90aXRsZT4KICA8L3RpdGxlcz4KICA8cHVibGlzaGVyPk11c2V1bSBvZiBWZXJ0ZWJyYXRlIFpvb2xvZ3k8L3B1Ymxpc2hlcj4KICA8cHVibGljYXRpb25ZZWFyPjE5MTI8L3B1YmxpY2F0aW9uWWVhcj4KICA8cmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZUdlbmVyYWw9IkltYWdlIi8+CjwvcmVzb3VyY2U+Cg=='}, 'relationships': {'data-center': {'data': {'id': 'cdl.ucbmvz', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7299/x78c9tfq', 'type': 'works', 'attributes': {'doi': '10.7299/x78c9tfq', 'identifier': 'https://doi.org/10.7299/x78c9tfq', 'url': 'http://arctos.database.museum/media/10001537', 'author': [{'literal': 'Charles D. Holliger'}], 'title': 'Garter Snake', 'container-title': 'Museum of Vertebrate Zoology', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'cdl.ucbmvz', 'member-id': 'cdl', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1915', 'registered': '2013-04-10T03:05:19Z', 'checked': None, 'updated': '2016-06-17T23:51:40Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIKICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMKICAgIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj4KICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43Mjk5L1g3OEM5VEZRPC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Q2hhcmxlcyBELiBIb2xsaWdlcjwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgPC9jcmVhdG9ycz4KICA8dGl0bGVzPgogICAgPHRpdGxlPkdhcnRlciBTbmFrZTwvdGl0bGU+CiAgPC90aXRsZXM+CiAgPHB1Ymxpc2hlcj5NdXNldW0gb2YgVmVydGVicmF0ZSBab29sb2d5PC9wdWJsaXNoZXI+CiAgPHB1YmxpY2F0aW9uWWVhcj4xOTE1PC9wdWJsaWNhdGlvblllYXI+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSIvPgo8L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'cdl.ucbmvz', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7299/x7kp80bz', 'type': 'works', 'attributes': {'doi': '10.7299/x7kp80bz', 'identifier': 'https://doi.org/10.7299/x7kp80bz', 'url': 'http://arctos.database.museum/media/10001536', 'author': [{'literal': 'Charles D. Holliger'}], 'title': 'Gopher snake', 'container-title': 'Museum of Vertebrate Zoology', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'cdl.ucbmvz', 'member-id': 'cdl', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1915', 'registered': '2013-04-10T03:05:35Z', 'checked': None, 'updated': '2016-06-17T23:55:02Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIKICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMKICAgIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj4KICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43Mjk5L1g3S1A4MEJaPC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Q2hhcmxlcyBELiBIb2xsaWdlcjwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgPC9jcmVhdG9ycz4KICA8dGl0bGVzPgogICAgPHRpdGxlPkdvcGhlciBzbmFrZTwvdGl0bGU+CiAgPC90aXRsZXM+CiAgPHB1Ymxpc2hlcj5NdXNldW0gb2YgVmVydGVicmF0ZSBab29sb2d5PC9wdWJsaXNoZXI+CiAgPHB1YmxpY2F0aW9uWWVhcj4xOTE1PC9wdWJsaWNhdGlvblllYXI+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSIvPgo8L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'cdl.ucbmvz', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7299/x70r9mkb', 'type': 'works', 'attributes': {'doi': '10.7299/x70r9mkb', 'identifier': 'https://doi.org/10.7299/x70r9mkb', 'url': 'http://arctos.database.museum/media/10001538', 'author': [{'literal': 'Charles D. Holliger'}], 'title': 'King Snake', 'container-title': 'Museum of Vertebrate Zoology', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'cdl.ucbmvz', 'member-id': 'cdl', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1915', 'registered': '2013-04-10T03:06:03Z', 'checked': None, 'updated': '2016-06-18T00:16:32Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIKICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMKICAgIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj4KICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43Mjk5L1g3MFI5TUtCPC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Q2hhcmxlcyBELiBIb2xsaWdlcjwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgPC9jcmVhdG9ycz4KICA8dGl0bGVzPgogICAgPHRpdGxlPktpbmcgU25ha2U8L3RpdGxlPgogIDwvdGl0bGVzPgogIDxwdWJsaXNoZXI+TXVzZXVtIG9mIFZlcnRlYnJhdGUgWm9vbG9neTwvcHVibGlzaGVyPgogIDxwdWJsaWNhdGlvblllYXI+MTkxNTwvcHVibGljYXRpb25ZZWFyPgogIDxyZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlR2VuZXJhbD0iSW1hZ2UiLz4KPC9yZXNvdXJjZT4K'}, 'relationships': {'data-center': {'data': {'id': 'cdl.ucbmvz', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7299/x7k35t3r', 'type': 'works', 'attributes': {'doi': '10.7299/x7k35t3r', 'identifier': 'https://doi.org/10.7299/x7k35t3r', 'url': 'http://arctos.database.museum/media/10007381', 'author': [{'literal': 'Robert C. Stebbins'}], 'title': 'Snake trap', 'container-title': 'Museum of Vertebrate Zoology', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'cdl.ucbmvz', 'member-id': 'cdl', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1947', 'registered': '2013-04-10T06:55:43Z', 'checked': None, 'updated': '2016-06-18T01:44:04Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIKICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMKICAgIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj4KICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43Mjk5L1g3SzM1VDNSPC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Um9iZXJ0IEMuIFN0ZWJiaW5zPC9jcmVhdG9yTmFtZT4KICAgIDwvY3JlYXRvcj4KICA8L2NyZWF0b3JzPgogIDx0aXRsZXM+CiAgICA8dGl0bGU+U25ha2UgdHJhcDwvdGl0bGU+CiAgPC90aXRsZXM+CiAgPHB1Ymxpc2hlcj5NdXNldW0gb2YgVmVydGVicmF0ZSBab29sb2d5PC9wdWJsaXNoZXI+CiAgPHB1YmxpY2F0aW9uWWVhcj4xOTQ3PC9wdWJsaWNhdGlvblllYXI+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSIvPgo8L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'cdl.ucbmvz', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7299/x72v2fk8', 'type': 'works', 'attributes': {'doi': '10.7299/x72v2fk8', 'identifier': 'https://doi.org/10.7299/x72v2fk8', 'url': 'http://arctos.database.museum/media/10007381', 'author': [{'literal': 'Robert C. Stebbins'}], 'title': 'Snake trap', 'container-title': 'Museum of Vertebrate Zoology', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'cdl.ucbmvz', 'member-id': 'cdl', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1947', 'registered': '2013-04-10T06:56:26Z', 'checked': None, 'updated': '2016-06-18T01:44:02Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIKICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMKICAgIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj4KICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43Mjk5L1g3MlYyRks4PC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Um9iZXJ0IEMuIFN0ZWJiaW5zPC9jcmVhdG9yTmFtZT4KICAgIDwvY3JlYXRvcj4KICA8L2NyZWF0b3JzPgogIDx0aXRsZXM+CiAgICA8dGl0bGU+U25ha2UgdHJhcDwvdGl0bGU+CiAgPC90aXRsZXM+CiAgPHB1Ymxpc2hlcj5NdXNldW0gb2YgVmVydGVicmF0ZSBab29sb2d5PC9wdWJsaXNoZXI+CiAgPHB1YmxpY2F0aW9uWWVhcj4xOTQ3PC9wdWJsaWNhdGlvblllYXI+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSIvPgo8L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'cdl.ucbmvz', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.7299/x76h4gw8', 'type': 'works', 'attributes': {'doi': '10.7299/x76h4gw8', 'identifier': 'https://doi.org/10.7299/x76h4gw8', 'url': 'http://arctos.database.museum/media/10007381', 'author': [{'literal': 'Robert C. Stebbins'}], 'title': 'Snake trap', 'container-title': 'Museum of Vertebrate Zoology', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'cdl.ucbmvz', 'member-id': 'cdl', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1947', 'registered': '2013-04-10T06:57:10Z', 'checked': None, 'updated': '2016-06-18T01:44:03Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIKICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMKICAgIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj4KICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC43Mjk5L1g3Nkg0R1c4PC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Um9iZXJ0IEMuIFN0ZWJiaW5zPC9jcmVhdG9yTmFtZT4KICAgIDwvY3JlYXRvcj4KICA8L2NyZWF0b3JzPgogIDx0aXRsZXM+CiAgICA8dGl0bGU+U25ha2UgdHJhcDwvdGl0bGU+CiAgPC90aXRsZXM+CiAgPHB1Ymxpc2hlcj5NdXNldW0gb2YgVmVydGVicmF0ZSBab29sb2d5PC9wdWJsaXNoZXI+CiAgPHB1YmxpY2F0aW9uWWVhcj4xOTQ3PC9wdWJsaWNhdGlvblllYXI+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSIvPgo8L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'cdl.ucbmvz', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.5061/dryad.868/2', 'type': 'works', 'attributes': {'doi': '10.5061/dryad.868/2', 'identifier': 'https://doi.org/10.5061/dryad.868/2', 'url': 'http://datadryad.org/resource/doi:10.5061/dryad.868/2', 'author': [{'given': 'Brice', 'family': 'Noonan'}, {'given': 'Jack W', 'family': 'Sites'}, {'given': 'Brice', 'family': 'Noonan'}, {'given': 'Jack W', 'family': 'Sites'}], 'title': 'Snake Alignment', 'container-title': 'Dryad Digital Repository', 'description': None, 'resource-type-subtype': 'DataFile', 'data-center-id': 'cdl.dryad', 'member-id': 'cdl', 'resource-type-id': 'dataset', 'version': '1', 'license': 'https://creativecommons.org/publicdomain/zero/1.0/', 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2009', 'registered': '2010-06-08T01:34:22Z', 'checked': None, 'updated': '2017-02-04T07:15:54Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6bWV0cz0iaHR0cDovL3d3dy5sb2MuZ292L01FVFMvIiB4bWxuczpkc3BhY2U9Imh0dHA6Ly93d3cuZHNwYWNlLm9yZy94bWxucy9kc3BhY2UvZGltIiB4bWxuczpkaW09Imh0dHA6Ly93d3cuZHNwYWNlLm9yZy94bWxucy9kc3BhY2UvZGltIiB4bWxuczpkcnlhZD0iaHR0cDovL3B1cmwub3JnL2RyeWFkL3Rlcm1zLyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC0zL21ldGFkYXRhLnhzZCI+ICA8aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC41MDYxL0RSWUFELjg2OC8yPC9pZGVudGlmaWVyPiAgPHZlcnNpb24+MTwvdmVyc2lvbj4gIDxjcmVhdG9ycz4gICAgPGNyZWF0b3I+ICAgICAgPGNyZWF0b3JOYW1lPk5vb25hbiwgQnJpY2U8L2NyZWF0b3JOYW1lPiAgICA8L2NyZWF0b3I+ICAgIDxjcmVhdG9yPiAgICAgIDxjcmVhdG9yTmFtZT5TaXRlcywgSmFjayBXIEpyLjwvY3JlYXRvck5hbWU+ICAgIDwvY3JlYXRvcj4gICAgPGNyZWF0b3I+ICAgICAgPGNyZWF0b3JOYW1lPk5vb25hbiwgQnJpY2U8L2NyZWF0b3JOYW1lPiAgICA8L2NyZWF0b3I+ICAgIDxjcmVhdG9yPiAgICAgIDxjcmVhdG9yTmFtZT5TaXRlcywgSmFjayBXIEpyLjwvY3JlYXRvck5hbWU+ICAgIDwvY3JlYXRvcj4gIDwvY3JlYXRvcnM+ICA8dGl0bGVzPiAgICA8dGl0bGU+U25ha2UgQWxpZ25tZW50PC90aXRsZT4gIDwvdGl0bGVzPiAgPHB1Ymxpc2hlcj5EcnlhZCBEaWdpdGFsIFJlcG9zaXRvcnk8L3B1Ymxpc2hlcj4gIDxwdWJsaWNhdGlvblllYXI+MjAwOTwvcHVibGljYXRpb25ZZWFyPiAgPHN1YmplY3RzPiAgICA8c3ViamVjdD5CaW9nZW9ncmFwaHk8L3N1YmplY3Q+ICAgIDxzdWJqZWN0PlJlcHRpbGU8L3N1YmplY3Q+ICA8L3N1YmplY3RzPiAgPGRhdGVzPiAgICA8ZGF0ZSBkYXRlVHlwZT0iQWNjZXB0ZWQiPjIwMDktMDktMDFUMTU6MzA6NDBaPC9kYXRlPiAgPC9kYXRlcz4gIDxyZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlR2VuZXJhbD0iRGF0YXNldCI+RGF0YUZpbGU8L3Jlc291cmNlVHlwZT4gIDxyZWxhdGVkSWRlbnRpZmllcnM+ICAgIDxyZWxhdGVkSWRlbnRpZmllciByZWxhdGVkSWRlbnRpZmllclR5cGU9IkRPSSIgcmVsYXRpb25UeXBlPSJJc1BhcnRPZiI+MTAuNTA2MS9EUllBRC44Njg8L3JlbGF0ZWRJZGVudGlmaWVyPiAgPC9yZWxhdGVkSWRlbnRpZmllcnM+ICA8cmlnaHRzTGlzdD4gICAgPHJpZ2h0cyByaWdodHNVUkk9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8iLz4gIDwvcmlnaHRzTGlzdD4gIDxkZXNjcmlwdGlvbnM+ICAgIDxkZXNjcmlwdGlvbiBkZXNjcmlwdGlvblR5cGU9Ik90aGVyIi8+ICA8L2Rlc2NyaXB0aW9ucz48L3Jlc291cmNlPg=='}, 'relationships': {'data-center': {'data': {'id': 'cdl.dryad', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cdl', 'type': 'members'}}, 'resource-type': {'data': {'id': 'dataset', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.3932/ethz-a-000200296', 'type': 'works', 'attributes': {'doi': '10.3932/ethz-a-000200296', 'identifier': 'https://doi.org/10.3932/ethz-a-000200296', 'url': None, 'author': [{'literal': 'Unbekannt'}], 'title': 'Snake Charmers', 'container-title': 'ETH-Bibliothek Zürich, Bildarchiv', 'description': 'Poststempel 15.4.1908.', 'resource-type-subtype': None, 'data-center-id': 'ethz.epics-ba', 'member-id': 'ethz', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1908', 'registered': '2010-03-15T08:59:02Z', 'checked': None, 'updated': '2015-12-16T19:59:25Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48cmVzb3VyY2UgeG1sbnM9Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj48aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC4zOTMyL2V0aHotYS0wMDAyMDAyOTY8L2lkZW50aWZpZXI+PGNyZWF0b3JzPjxjcmVhdG9yPjxjcmVhdG9yTmFtZT5VbmJla2FubnQ8L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48L2NyZWF0b3JzPjx0aXRsZXM+PHRpdGxlPlNuYWtlIENoYXJtZXJzPC90aXRsZT48L3RpdGxlcz48cHVibGlzaGVyPkVUSC1CaWJsaW90aGVrIFrDvHJpY2gsIEJpbGRhcmNoaXY8L3B1Ymxpc2hlcj48cHVibGljYXRpb25ZZWFyPjE5MDg8L3B1YmxpY2F0aW9uWWVhcj48ZGF0ZXM+PGRhdGUgZGF0ZVR5cGU9IkF2YWlsYWJsZSI+MTkwODwvZGF0ZT48L2RhdGVzPjxsYW5ndWFnZT5kZTwvbGFuZ3VhZ2U+PHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSI+PC9yZXNvdXJjZVR5cGU+PGZvcm1hdHM+PGZvcm1hdD5KUEVHLUJpbGQ8L2Zvcm1hdD48L2Zvcm1hdHM+PGRlc2NyaXB0aW9ucz48ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJPdGhlciI+UG9zdHN0ZW1wZWwgMTUuNC4xOTA4LjwvZGVzY3JpcHRpb24+PGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uVHlwZT0iT3RoZXIiPkZyZWkgenVtIEhlcnVudGVybGFkZW48L2Rlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb25zPjwvcmVzb3VyY2U+'}, 'relationships': {'data-center': {'data': {'id': 'ethz.epics-ba', 'type': 'data-centers'}}, 'member': {'data': {'id': 'ethz', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.3932/ethz-a-000207736', 'type': 'works', 'attributes': {'doi': '10.3932/ethz-a-000207736', 'identifier': 'https://doi.org/10.3932/ethz-a-000207736', 'url': None, 'author': [{'literal': 'Unbekannt'}], 'title': 'Snake charmers', 'container-title': 'ETH-Bibliothek Zürich, Bildarchiv', 'description': 'Frei zum Herunterladen', 'resource-type-subtype': None, 'data-center-id': 'ethz.epics-ba', 'member-id': 'ethz', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1929', 'registered': '2010-03-15T09:55:21Z', 'checked': None, 'updated': '2015-06-10T18:32:51Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48cmVzb3VyY2UgeG1sbnM9Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj48aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC4zOTMyL2V0aHotYS0wMDAyMDc3MzY8L2lkZW50aWZpZXI+PGNyZWF0b3JzPjxjcmVhdG9yPjxjcmVhdG9yTmFtZT5VbmJla2FubnQ8L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48L2NyZWF0b3JzPjx0aXRsZXM+PHRpdGxlPlNuYWtlIGNoYXJtZXJzPC90aXRsZT48L3RpdGxlcz48cHVibGlzaGVyPkVUSC1CaWJsaW90aGVrIFrDvHJpY2gsIEJpbGRhcmNoaXY8L3B1Ymxpc2hlcj48cHVibGljYXRpb25ZZWFyPjE5Mjk8L3B1YmxpY2F0aW9uWWVhcj48ZGF0ZXM+PGRhdGUgZGF0ZVR5cGU9IkF2YWlsYWJsZSI+MTkyOTwvZGF0ZT48L2RhdGVzPjxsYW5ndWFnZT5kZTwvbGFuZ3VhZ2U+PHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSI+PC9yZXNvdXJjZVR5cGU+PGZvcm1hdHM+PGZvcm1hdD5KUEVHLUJpbGQ8L2Zvcm1hdD48L2Zvcm1hdHM+PGRlc2NyaXB0aW9ucz48ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJPdGhlciI+RnJlaSB6dW0gSGVydW50ZXJsYWRlbjwvZGVzY3JpcHRpb24+PGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uVHlwZT0iT3RoZXIiPkdlbGF1ZmVuIHVtIDE5Mjk8L2Rlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb25zPjwvcmVzb3VyY2U+'}, 'relationships': {'data-center': {'data': {'id': 'ethz.epics-ba', 'type': 'data-centers'}}, 'member': {'data': {'id': 'ethz', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.3932/ethz-a-000249278', 'type': 'works', 'attributes': {'doi': '10.3932/ethz-a-000249278', 'identifier': 'https://doi.org/10.3932/ethz-a-000249278', 'url': None, 'author': [{'literal': 'Unbekannt'}], 'title': 'Snake charmers', 'container-title': 'ETH-Bibliothek Zürich, Bildarchiv', 'description': 'Frei zum Herunterladen', 'resource-type-subtype': None, 'data-center-id': 'ethz.epics-ba', 'member-id': 'ethz', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1929', 'registered': '2011-05-24T13:32:26Z', 'checked': None, 'updated': '2015-06-10T18:53:15Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48cmVzb3VyY2UgeG1sbnM9Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj48aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC4zOTMyL2V0aHotYS0wMDAyNDkyNzg8L2lkZW50aWZpZXI+PGNyZWF0b3JzPjxjcmVhdG9yPjxjcmVhdG9yTmFtZT5VbmJla2FubnQ8L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48L2NyZWF0b3JzPjx0aXRsZXM+PHRpdGxlPlNuYWtlIGNoYXJtZXJzPC90aXRsZT48L3RpdGxlcz48cHVibGlzaGVyPkVUSC1CaWJsaW90aGVrIFrDvHJpY2gsIEJpbGRhcmNoaXY8L3B1Ymxpc2hlcj48cHVibGljYXRpb25ZZWFyPjE5Mjk8L3B1YmxpY2F0aW9uWWVhcj48ZGF0ZXM+PGRhdGUgZGF0ZVR5cGU9IkF2YWlsYWJsZSI+MTkyOTwvZGF0ZT48L2RhdGVzPjxsYW5ndWFnZT5kZTwvbGFuZ3VhZ2U+PHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSI+PC9yZXNvdXJjZVR5cGU+PGZvcm1hdHM+PGZvcm1hdD5USUZGLUJpbGQ8L2Zvcm1hdD48L2Zvcm1hdHM+PGRlc2NyaXB0aW9ucz48ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJPdGhlciI+RnJlaSB6dW0gSGVydW50ZXJsYWRlbjwvZGVzY3JpcHRpb24+PGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uVHlwZT0iT3RoZXIiPkdlbGF1ZmVuIHVtIDE5Mjk8L2Rlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb25zPjwvcmVzb3VyY2U+'}, 'relationships': {'data-center': {'data': {'id': 'ethz.epics-ba', 'type': 'data-centers'}}, 'member': {'data': {'id': 'ethz', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.3932/ethz-a-000171364', 'type': 'works', 'attributes': {'doi': '10.3932/ethz-a-000171364', 'identifier': 'https://doi.org/10.3932/ethz-a-000171364', 'url': None, 'author': [{'literal': 'Unbekannt'}], 'title': 'Snake Charmers', 'container-title': 'ETH-Bibliothek Zürich, Bildarchiv', 'description': 'Poststempel 15.4.1908.', 'resource-type-subtype': None, 'data-center-id': 'ethz.epics-ba', 'member-id': 'ethz', 'resource-type-id': 'image', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '1908', 'registered': '2010-03-15T09:14:01Z', 'checked': None, 'updated': '2015-12-25T18:47:11Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48cmVzb3VyY2UgeG1sbnM9Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIGh0dHA6Ly9zY2hlbWEuZGF0YWNpdGUub3JnL21ldGEva2VybmVsLTMvbWV0YWRhdGEueHNkIj48aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC4zOTMyL2V0aHotYS0wMDAxNzEzNjQ8L2lkZW50aWZpZXI+PGNyZWF0b3JzPjxjcmVhdG9yPjxjcmVhdG9yTmFtZT5VbmJla2FubnQ8L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48L2NyZWF0b3JzPjx0aXRsZXM+PHRpdGxlPlNuYWtlIENoYXJtZXJzPC90aXRsZT48L3RpdGxlcz48cHVibGlzaGVyPkVUSC1CaWJsaW90aGVrIFrDvHJpY2gsIEJpbGRhcmNoaXY8L3B1Ymxpc2hlcj48cHVibGljYXRpb25ZZWFyPjE5MDg8L3B1YmxpY2F0aW9uWWVhcj48ZGF0ZXM+PGRhdGUgZGF0ZVR5cGU9IkF2YWlsYWJsZSI+MTkwODwvZGF0ZT48L2RhdGVzPjxsYW5ndWFnZT5kZTwvbGFuZ3VhZ2U+PHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJJbWFnZSI+PC9yZXNvdXJjZVR5cGU+PGZvcm1hdHM+PGZvcm1hdD5KUEVHLUJpbGQ8L2Zvcm1hdD48L2Zvcm1hdHM+PGRlc2NyaXB0aW9ucz48ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJPdGhlciI+UG9zdHN0ZW1wZWwgMTUuNC4xOTA4LjwvZGVzY3JpcHRpb24+PGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uVHlwZT0iT3RoZXIiPkZyZWkgenVtIEhlcnVudGVybGFkZW48L2Rlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb25zPjwvcmVzb3VyY2U+'}, 'relationships': {'data-center': {'data': {'id': 'ethz.epics-ba', 'type': 'data-centers'}}, 'member': {'data': {'id': 'ethz', 'type': 'members'}}, 'resource-type': {'data': {'id': 'image', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.4225/72/56f55a20c7481', 'type': 'works', 'attributes': {'doi': '10.4225/72/56f55a20c7481', 'identifier': 'https://doi.org/10.4225/72/56f55a20c7481', 'url': None, 'author': [{'literal': 'Laura Dimock'}], 'title': 'snake yam', 'container-title': 'PARADISEC', 'description': None, 'resource-type-subtype': None, 'data-center-id': 'ands.centre72', 'member-id': 'ands', 'resource-type-id': None, 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2007', 'registered': '2016-03-25T15:32:53Z', 'checked': None, 'updated': '2016-03-25T15:32:53Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxyZXNvdXJjZSB4bWxucz0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RhdGFjaXRlLm9yZy9zY2hlbWEva2VybmVsLTMgaHR0cDovL3NjaGVtYS5kYXRhY2l0ZS5vcmcvbWV0YS9rZXJuZWwtMy9tZXRhZGF0YS54c2QiPjxpZGVudGlmaWVyIGlkZW50aWZpZXJUeXBlPSJET0kiPjEwLjQyMjUvNzIvNTZGNTVBMjBDNzQ4MTwvaWRlbnRpZmllcj48Y3JlYXRvcnM+PGNyZWF0b3I+PGNyZWF0b3JOYW1lPkxhdXJhIERpbW9jazwvY3JlYXRvck5hbWU+PC9jcmVhdG9yPjwvY3JlYXRvcnM+PHRpdGxlcz48dGl0bGU+c25ha2UgeWFtPC90aXRsZT48L3RpdGxlcz48cHVibGlzaGVyPlBBUkFESVNFQzwvcHVibGlzaGVyPjxwdWJsaWNhdGlvblllYXI+MjAwNzwvcHVibGljYXRpb25ZZWFyPjxjb250cmlidXRvcnM+PGNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yVHlwZT0iRGF0YUNvbGxlY3RvciI+PGNvbnRyaWJ1dG9yTmFtZT5MYXVyYSBEaW1vY2s8L2NvbnRyaWJ1dG9yTmFtZT48L2NvbnRyaWJ1dG9yPjxjb250cmlidXRvciBjb250cmlidXRvclR5cGU9IkRhdGFDb2xsZWN0b3IiPjxjb250cmlidXRvck5hbWU+VmljdG9yaWEgVW5pdmVyc2l0eSBvZiBXZWxsaW5ndG9uPC9jb250cmlidXRvck5hbWU+PC9jb250cmlidXRvcj48L2NvbnRyaWJ1dG9ycz48cmVsYXRlZElkZW50aWZpZXJzPjxyZWxhdGVkSWRlbnRpZmllciByZWxhdGVkSWRlbnRpZmllclR5cGU9IkRPSSIgcmVsYXRpb25UeXBlPSJJc1BhcnRPZiI+MTAuNDIyNS83Mi81NkU4MjVBQjQ4MjI5PC9yZWxhdGVkSWRlbnRpZmllcj48L3JlbGF0ZWRJZGVudGlmaWVycz48L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'ands.centre72', 'type': 'data-centers'}}, 'member': {'data': {'id': 'ands', 'type': 'members'}}, 'resource-type': {'data': None}}}, {'id': 'https://doi.org/10.5281/zenodo.846553', 'type': 'works', 'attributes': {'doi': '10.5281/zenodo.846553', 'identifier': 'https://doi.org/10.5281/zenodo.846553', 'url': None, 'author': [{'literal': 'Christo Ananth'}, {'literal': 'S.Suryakala'}, {'literal': 'I.V.Sushmitha Dani'}, {'literal': 'I.Shibiya Sherlin'}, {'literal': 'S.Sheba Monic'}, {'literal': 'A.Sushma Thavakumari'}], 'title': 'Vector Image Model To Object Boundary Detection In Noisy Images', 'container-title': 'Zenodo', 'description': 'A New model is designed for boundary<br>\ndetection and applied it to object segmentation problem<br>\nin medical images. Our edge following technique<br>\nincorporates a vector image model and the edge map<br>\ninformation. The proposed technique was applied to<br>\ndetect the object boundaries in several types of noisy<br>\nimages where the ill-defined edges were encountered. The<br>\nproposed techniques performances on object<br>\nsegmentation and computation time were evaluated by<br>\ncomparing with the popular methods, i.e., the ACM, GVF<br>\nsnake models. Several synthetic noisy images were<br>\ncreated and tested. The method is successfully tested in<br>\ndifferent types of medical images including aortas in<br>\ncardiovascular MR images, and heart in CT images.', 'resource-type-subtype': 'Journal article', 'data-center-id': 'cern.zenodo', 'member-id': 'cern', 'resource-type-id': 'text', 'version': None, 'license': 'https://creativecommons.org/licenses/by/4.0/', 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2017', 'registered': '2017-08-22T06:55:37Z', 'checked': None, 'updated': '2017-08-22T06:55:37Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPHJlc291cmNlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC0zL21ldGFkYXRhLnhzZCI+CiAgPGlkZW50aWZpZXIgaWRlbnRpZmllclR5cGU9IkRPSSI+MTAuNTI4MS96ZW5vZG8uODQ2NTUzPC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Q2hyaXN0byBBbmFudGg8L2NyZWF0b3JOYW1lPgogICAgPC9jcmVhdG9yPgogICAgPGNyZWF0b3I+CiAgICAgIDxjcmVhdG9yTmFtZT5TLlN1cnlha2FsYTwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPkkuVi5TdXNobWl0aGEgRGFuaTwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPkkuU2hpYml5YSBTaGVybGluPC9jcmVhdG9yTmFtZT4KICAgIDwvY3JlYXRvcj4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Uy5TaGViYSBNb25pYzwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPkEuU3VzaG1hIFRoYXZha3VtYXJpPC9jcmVhdG9yTmFtZT4KICAgIDwvY3JlYXRvcj4KICA8L2NyZWF0b3JzPgogIDx0aXRsZXM+CiAgICA8dGl0bGU+VmVjdG9yIEltYWdlIE1vZGVsIFRvIE9iamVjdCBCb3VuZGFyeSBEZXRlY3Rpb24gSW4gTm9pc3kgSW1hZ2VzPC90aXRsZT4KICA8L3RpdGxlcz4KICA8cHVibGlzaGVyPlplbm9kbzwvcHVibGlzaGVyPgogIDxwdWJsaWNhdGlvblllYXI+MjAxNzwvcHVibGljYXRpb25ZZWFyPgogIDxzdWJqZWN0cz4KICAgIDxzdWJqZWN0Pk5vaXN5IEltYWdlcywgQUNNLCBHVkYgc25ha2UgbW9kZWxzPC9zdWJqZWN0PgogIDwvc3ViamVjdHM+CiAgPGRhdGVzPgogICAgPGRhdGUgZGF0ZVR5cGU9Iklzc3VlZCI+MjAxNy0wOC0yMjwvZGF0ZT4KICA8L2RhdGVzPgogIDxyZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlR2VuZXJhbD0iVGV4dCI+Sm91cm5hbCBhcnRpY2xlPC9yZXNvdXJjZVR5cGU+CiAgPGFsdGVybmF0ZUlkZW50aWZpZXJzPgogICAgPGFsdGVybmF0ZUlkZW50aWZpZXIgYWx0ZXJuYXRlSWRlbnRpZmllclR5cGU9InVybCI+aHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZC8xMC41MjgxL3plbm9kby44NDY1NTM8L2FsdGVybmF0ZUlkZW50aWZpZXI+CiAgPC9hbHRlcm5hdGVJZGVudGlmaWVycz4KICA8cmVsYXRlZElkZW50aWZpZXJzPgogICAgPHJlbGF0ZWRJZGVudGlmaWVyIHJlbGF0ZWRJZGVudGlmaWVyVHlwZT0iRE9JIiByZWxhdGlvblR5cGU9IklzUGFydE9mIj4xMC41MjgxL3plbm9kby44NDY1NTI8L3JlbGF0ZWRJZGVudGlmaWVyPgogIDwvcmVsYXRlZElkZW50aWZpZXJzPgogIDxyaWdodHNMaXN0PgogICAgPHJpZ2h0cyByaWdodHNVUkk9Imh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS80LjAvIj5DcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDQuMDwvcmlnaHRzPgogICAgPHJpZ2h0cyByaWdodHNVUkk9ImluZm86ZXUtcmVwby9zZW1hbnRpY3Mvb3BlbkFjY2VzcyI+T3BlbiBBY2Nlc3M8L3JpZ2h0cz4KICA8L3JpZ2h0c0xpc3Q+CiAgPGRlc2NyaXB0aW9ucz4KICAgIDxkZXNjcmlwdGlvbiBkZXNjcmlwdGlvblR5cGU9IkFic3RyYWN0Ij4mbHQ7cCZndDtBIE5ldyBtb2RlbCBpcyBkZXNpZ25lZCBmb3IgYm91bmRhcnkmbHQ7YnImZ3Q7CmRldGVjdGlvbiBhbmQgYXBwbGllZCBpdCB0byBvYmplY3Qgc2VnbWVudGF0aW9uIHByb2JsZW0mbHQ7YnImZ3Q7CmluIG1lZGljYWwgaW1hZ2VzLiBPdXIgZWRnZSBmb2xsb3dpbmcgdGVjaG5pcXVlJmx0O2JyJmd0OwppbmNvcnBvcmF0ZXMgYSB2ZWN0b3IgaW1hZ2UgbW9kZWwgYW5kIHRoZSBlZGdlIG1hcCZsdDticiZndDsKaW5mb3JtYXRpb24uIFRoZSBwcm9wb3NlZCB0ZWNobmlxdWUgd2FzIGFwcGxpZWQgdG8mbHQ7YnImZ3Q7CmRldGVjdCB0aGUgb2JqZWN0IGJvdW5kYXJpZXMgaW4gc2V2ZXJhbCB0eXBlcyBvZiBub2lzeSZsdDticiZndDsKaW1hZ2VzIHdoZXJlIHRoZSBpbGwtZGVmaW5lZCBlZGdlcyB3ZXJlIGVuY291bnRlcmVkLiBUaGUmbHQ7YnImZ3Q7CnByb3Bvc2VkIHRlY2huaXF1ZXMgcGVyZm9ybWFuY2VzIG9uIG9iamVjdCZsdDticiZndDsKc2VnbWVudGF0aW9uIGFuZCBjb21wdXRhdGlvbiB0aW1lIHdlcmUgZXZhbHVhdGVkIGJ5Jmx0O2JyJmd0Owpjb21wYXJpbmcgd2l0aCB0aGUgcG9wdWxhciBtZXRob2RzLCBpLmUuLCB0aGUgQUNNLCBHVkYmbHQ7YnImZ3Q7CnNuYWtlIG1vZGVscy4gU2V2ZXJhbCBzeW50aGV0aWMgbm9pc3kgaW1hZ2VzIHdlcmUmbHQ7YnImZ3Q7CmNyZWF0ZWQgYW5kIHRlc3RlZC4gVGhlIG1ldGhvZCBpcyBzdWNjZXNzZnVsbHkgdGVzdGVkIGluJmx0O2JyJmd0OwpkaWZmZXJlbnQgdHlwZXMgb2YgbWVkaWNhbCBpbWFnZXMgaW5jbHVkaW5nIGFvcnRhcyBpbiZsdDticiZndDsKY2FyZGlvdmFzY3VsYXIgTVIgaW1hZ2VzLCBhbmQgaGVhcnQgaW4gQ1QgaW1hZ2VzLiZsdDsvcCZndDs8L2Rlc2NyaXB0aW9uPgogIDwvZGVzY3JpcHRpb25zPgo8L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'cern.zenodo', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cern', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.5281/zenodo.846552', 'type': 'works', 'attributes': {'doi': '10.5281/zenodo.846552', 'identifier': 'https://doi.org/10.5281/zenodo.846552', 'url': None, 'author': [{'literal': 'Christo Ananth'}, {'literal': 'S.Suryakala'}, {'literal': 'I.V.Sushmitha Dani'}, {'literal': 'I.Shibiya Sherlin'}, {'literal': 'S.Sheba Monic'}, {'literal': 'A.Sushma Thavakumari'}], 'title': 'Vector Image Model To Object Boundary Detection In Noisy Images', 'container-title': 'Zenodo', 'description': 'A New model is designed for boundary<br>\ndetection and applied it to object segmentation problem<br>\nin medical images. Our edge following technique<br>\nincorporates a vector image model and the edge map<br>\ninformation. The proposed technique was applied to<br>\ndetect the object boundaries in several types of noisy<br>\nimages where the ill-defined edges were encountered. The<br>\nproposed techniques performances on object<br>\nsegmentation and computation time were evaluated by<br>\ncomparing with the popular methods, i.e., the ACM, GVF<br>\nsnake models. Several synthetic noisy images were<br>\ncreated and tested. The method is successfully tested in<br>\ndifferent types of medical images including aortas in<br>\ncardiovascular MR images, and heart in CT images.', 'resource-type-subtype': 'Journal article', 'data-center-id': 'cern.zenodo', 'member-id': 'cern', 'resource-type-id': 'text', 'version': None, 'license': 'https://creativecommons.org/licenses/by/4.0/', 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2017', 'registered': '2017-08-22T06:55:38Z', 'checked': None, 'updated': '2017-08-22T06:55:38Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPHJlc291cmNlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC0zL21ldGFkYXRhLnhzZCI+CiAgPGlkZW50aWZpZXIgaWRlbnRpZmllclR5cGU9IkRPSSI+MTAuNTI4MS96ZW5vZG8uODQ2NTUyPC9pZGVudGlmaWVyPgogIDxjcmVhdG9ycz4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Q2hyaXN0byBBbmFudGg8L2NyZWF0b3JOYW1lPgogICAgPC9jcmVhdG9yPgogICAgPGNyZWF0b3I+CiAgICAgIDxjcmVhdG9yTmFtZT5TLlN1cnlha2FsYTwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPkkuVi5TdXNobWl0aGEgRGFuaTwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPkkuU2hpYml5YSBTaGVybGluPC9jcmVhdG9yTmFtZT4KICAgIDwvY3JlYXRvcj4KICAgIDxjcmVhdG9yPgogICAgICA8Y3JlYXRvck5hbWU+Uy5TaGViYSBNb25pYzwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPkEuU3VzaG1hIFRoYXZha3VtYXJpPC9jcmVhdG9yTmFtZT4KICAgIDwvY3JlYXRvcj4KICA8L2NyZWF0b3JzPgogIDx0aXRsZXM+CiAgICA8dGl0bGU+VmVjdG9yIEltYWdlIE1vZGVsIFRvIE9iamVjdCBCb3VuZGFyeSBEZXRlY3Rpb24gSW4gTm9pc3kgSW1hZ2VzPC90aXRsZT4KICA8L3RpdGxlcz4KICA8cHVibGlzaGVyPlplbm9kbzwvcHVibGlzaGVyPgogIDxwdWJsaWNhdGlvblllYXI+MjAxNzwvcHVibGljYXRpb25ZZWFyPgogIDxzdWJqZWN0cz4KICAgIDxzdWJqZWN0Pk5vaXN5IEltYWdlcywgQUNNLCBHVkYgc25ha2UgbW9kZWxzPC9zdWJqZWN0PgogIDwvc3ViamVjdHM+CiAgPGRhdGVzPgogICAgPGRhdGUgZGF0ZVR5cGU9Iklzc3VlZCI+MjAxNy0wOC0yMjwvZGF0ZT4KICA8L2RhdGVzPgogIDxyZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlR2VuZXJhbD0iVGV4dCI+Sm91cm5hbCBhcnRpY2xlPC9yZXNvdXJjZVR5cGU+CiAgPGFsdGVybmF0ZUlkZW50aWZpZXJzPgogICAgPGFsdGVybmF0ZUlkZW50aWZpZXIgYWx0ZXJuYXRlSWRlbnRpZmllclR5cGU9InVybCI+aHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZC8xMC41MjgxL3plbm9kby44NDY1NTI8L2FsdGVybmF0ZUlkZW50aWZpZXI+CiAgPC9hbHRlcm5hdGVJZGVudGlmaWVycz4KICA8cmVsYXRlZElkZW50aWZpZXJzPgogICAgPHJlbGF0ZWRJZGVudGlmaWVyIHJlbGF0ZWRJZGVudGlmaWVyVHlwZT0iRE9JIiByZWxhdGlvblR5cGU9Ikhhc1BhcnQiPjEwLjUyODEvemVub2RvLjg0NjU1MzwvcmVsYXRlZElkZW50aWZpZXI+CiAgPC9yZWxhdGVkSWRlbnRpZmllcnM+CiAgPHJpZ2h0c0xpc3Q+CiAgICA8cmlnaHRzIHJpZ2h0c1VSST0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzQuMC8iPkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gNC4wPC9yaWdodHM+CiAgICA8cmlnaHRzIHJpZ2h0c1VSST0iaW5mbzpldS1yZXBvL3NlbWFudGljcy9vcGVuQWNjZXNzIj5PcGVuIEFjY2VzczwvcmlnaHRzPgogIDwvcmlnaHRzTGlzdD4KICA8ZGVzY3JpcHRpb25zPgogICAgPGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uVHlwZT0iQWJzdHJhY3QiPiZsdDtwJmd0O0EgTmV3IG1vZGVsIGlzIGRlc2lnbmVkIGZvciBib3VuZGFyeSZsdDticiZndDsKZGV0ZWN0aW9uIGFuZCBhcHBsaWVkIGl0IHRvIG9iamVjdCBzZWdtZW50YXRpb24gcHJvYmxlbSZsdDticiZndDsKaW4gbWVkaWNhbCBpbWFnZXMuIE91ciBlZGdlIGZvbGxvd2luZyB0ZWNobmlxdWUmbHQ7YnImZ3Q7CmluY29ycG9yYXRlcyBhIHZlY3RvciBpbWFnZSBtb2RlbCBhbmQgdGhlIGVkZ2UgbWFwJmx0O2JyJmd0OwppbmZvcm1hdGlvbi4gVGhlIHByb3Bvc2VkIHRlY2huaXF1ZSB3YXMgYXBwbGllZCB0byZsdDticiZndDsKZGV0ZWN0IHRoZSBvYmplY3QgYm91bmRhcmllcyBpbiBzZXZlcmFsIHR5cGVzIG9mIG5vaXN5Jmx0O2JyJmd0OwppbWFnZXMgd2hlcmUgdGhlIGlsbC1kZWZpbmVkIGVkZ2VzIHdlcmUgZW5jb3VudGVyZWQuIFRoZSZsdDticiZndDsKcHJvcG9zZWQgdGVjaG5pcXVlcyBwZXJmb3JtYW5jZXMgb24gb2JqZWN0Jmx0O2JyJmd0OwpzZWdtZW50YXRpb24gYW5kIGNvbXB1dGF0aW9uIHRpbWUgd2VyZSBldmFsdWF0ZWQgYnkmbHQ7YnImZ3Q7CmNvbXBhcmluZyB3aXRoIHRoZSBwb3B1bGFyIG1ldGhvZHMsIGkuZS4sIHRoZSBBQ00sIEdWRiZsdDticiZndDsKc25ha2UgbW9kZWxzLiBTZXZlcmFsIHN5bnRoZXRpYyBub2lzeSBpbWFnZXMgd2VyZSZsdDticiZndDsKY3JlYXRlZCBhbmQgdGVzdGVkLiBUaGUgbWV0aG9kIGlzIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgaW4mbHQ7YnImZ3Q7CmRpZmZlcmVudCB0eXBlcyBvZiBtZWRpY2FsIGltYWdlcyBpbmNsdWRpbmcgYW9ydGFzIGluJmx0O2JyJmd0OwpjYXJkaW92YXNjdWxhciBNUiBpbWFnZXMsIGFuZCBoZWFydCBpbiBDVCBpbWFnZXMuJmx0Oy9wJmd0OzwvZGVzY3JpcHRpb24+CiAgPC9kZXNjcmlwdGlvbnM+CjwvcmVzb3VyY2U+Cg=='}, 'relationships': {'data-center': {'data': {'id': 'cern.zenodo', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cern', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.14456/cmvj.2017.18', 'type': 'works', 'attributes': {'doi': '10.14456/cmvj.2017.18', 'identifier': 'https://doi.org/10.14456/cmvj.2017.18', 'url': None, 'author': [{'literal': 'Lamai Thongboon'}, {'literal': 'Sinlapachai Senarat'}, {'literal': 'Jes Kettratad'}, {'literal': 'Apinya Huskul'}, {'literal': 'Wannee Jiraungkoorskul'}, {'literal': 'Pisit Poolprasert'}, {'literal': 'Woranop Sukparangsi'}, {'literal': 'Nattarin Wongthamwanich'}], 'title': 'Microanatomical structure of the dog-faced water snake(Cerberus rynchops) from Thailand: A functional unit of the kidney', 'container-title': 'คณะสัตวแพทยศาสตร์ มหาวิทยาลัยเชียงใหม่', 'description': 'เชียงใหม่สัตวแพทยสาร, 15, 3', 'resource-type-subtype': 'Article', 'data-center-id': 'nrct.db1', 'member-id': 'nrct', 'resource-type-id': 'text', 'version': None, 'license': None, 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2560', 'registered': '2017-10-19T07:55:16Z', 'checked': None, 'updated': '2017-10-19T07:55:16Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cmVzb3VyY2UgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC0zL21ldGFkYXRhLnhzZCIgeG1sbnM9Imh0dHA6Ly9kYXRhY2l0ZS5vcmcvc2NoZW1hL2tlcm5lbC0zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj48aWRlbnRpZmllciBpZGVudGlmaWVyVHlwZT0iRE9JIj4xMC4xNDQ1Ni9jbXZqLjIwMTcuMTg8L2lkZW50aWZpZXI+PGNyZWF0b3JzID48Y3JlYXRvciA+PGNyZWF0b3JOYW1lID5MYW1haSBUaG9uZ2Jvb248L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48Y3JlYXRvciA+PGNyZWF0b3JOYW1lID5TaW5sYXBhY2hhaSBTZW5hcmF0PC9jcmVhdG9yTmFtZT48L2NyZWF0b3I+PGNyZWF0b3IgPjxjcmVhdG9yTmFtZSA+SmVzIEtldHRyYXRhZDwvY3JlYXRvck5hbWU+PC9jcmVhdG9yPjxjcmVhdG9yID48Y3JlYXRvck5hbWUgPkFwaW55YSBIdXNrdWw8L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48Y3JlYXRvciA+PGNyZWF0b3JOYW1lID5XYW5uZWUgSmlyYXVuZ2tvb3Jza3VsPC9jcmVhdG9yTmFtZT48L2NyZWF0b3I+PGNyZWF0b3IgPjxjcmVhdG9yTmFtZSA+UGlzaXQgUG9vbHByYXNlcnQ8L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48Y3JlYXRvciA+PGNyZWF0b3JOYW1lID5Xb3Jhbm9wIFN1a3BhcmFuZ3NpPC9jcmVhdG9yTmFtZT48L2NyZWF0b3I+PGNyZWF0b3IgPjxjcmVhdG9yTmFtZSA+TmF0dGFyaW4gV29uZ3RoYW13YW5pY2g8L2NyZWF0b3JOYW1lPjwvY3JlYXRvcj48L2NyZWF0b3JzPjx0aXRsZXMgPjx0aXRsZSA+TWljcm9hbmF0b21pY2FsIHN0cnVjdHVyZSBvZiB0aGUgZG9nLWZhY2VkIHdhdGVyIHNuYWtlKENlcmJlcnVzIHJ5bmNob3BzKSBmcm9tIFRoYWlsYW5kOiBBIGZ1bmN0aW9uYWwgdW5pdCBvZiB0aGUga2lkbmV5PC90aXRsZT48L3RpdGxlcz48c3ViamVjdHMgPjxzdWJqZWN0ID5lc3R1YXJpbmUgc25ha2UsIGhpc3RvbG9neSwgcmVuYWwgc3RydWN0dXJlLCBUaGFpbGFuZDwvc3ViamVjdD48L3N1YmplY3RzPjxkZXNjcmlwdGlvbnMgPjxkZXNjcmlwdGlvbiAgZGVzY3JpcHRpb25UeXBlPSJTZXJpZXNJbmZvcm1hdGlvbiI+4LmA4LiK4Li14Lii4LiH4LmD4Lir4Lih4LmI4Liq4Lix4LiV4Lin4LmB4Lie4LiX4Lii4Liq4Liy4LijLCAxNSwgMzwvZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbnM+PHB1Ymxpc2hlciA+4LiE4LiT4Liw4Liq4Lix4LiV4Lin4LmB4Lie4LiX4Lii4Lio4Liy4Liq4LiV4Lij4LmMIOC4oeC4q+C4suC4p+C4tOC4l+C4ouC4suC4peC4seC4ouC5gOC4iuC4teC4ouC4h+C5g+C4q+C4oeC5iDwvcHVibGlzaGVyPjxwdWJsaWNhdGlvblllYXIgPjI1NjA8L3B1YmxpY2F0aW9uWWVhcj48cmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZUdlbmVyYWw9IlRleHQiPkFydGljbGU8L3Jlc291cmNlVHlwZT48L3Jlc291cmNlPg=='}, 'relationships': {'data-center': {'data': {'id': 'nrct.db1', 'type': 'data-centers'}}, 'member': {'data': {'id': 'nrct', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.5281/zenodo.1089204', 'type': 'works', 'attributes': {'doi': '10.5281/zenodo.1089204', 'identifier': 'https://doi.org/10.5281/zenodo.1089204', 'url': None, 'author': [{'literal': 'M. Kumpugdee-Vollrath'}, {'literal': 'T. Subongkot'}, {'literal': 'T. Ngawhirunpat'}], 'title': 'Model Membrane From Shed Snake Skins', 'container-title': 'Zenodo', 'description': 'In this project we are interested in studying different kinds of shed snake skins in order to apply them as a model membrane for pharmaceutical purposes instead of human stratum corneum. Many types of shed snake skins as well as model drugs were studied by different techniques. The data will give deeper understanding about the interaction between drugs and model membranes and may allow us to choose the suitable model membrane for studying the effect of pharmaceutical products.', 'resource-type-subtype': 'Journal article', 'data-center-id': 'cern.zenodo', 'member-id': 'cern', 'resource-type-id': 'text', 'version': '9996661', 'license': 'https://creativecommons.org/licenses/by/4.0/', 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2013', 'registered': '2018-01-16T23:09:11Z', 'checked': None, 'updated': '2018-01-16T23:09:11Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPHJlc291cmNlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC0zL21ldGFkYXRhLnhzZCI+CiAgPGlkZW50aWZpZXIgaWRlbnRpZmllclR5cGU9IkRPSSI+MTAuNTI4MS96ZW5vZG8uMTA4OTIwNDwvaWRlbnRpZmllcj4KICA8Y3JlYXRvcnM+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPk0uIEt1bXB1Z2RlZS1Wb2xscmF0aDwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPlQuIFN1Ym9uZ2tvdDwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPlQuIE5nYXdoaXJ1bnBhdDwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgPC9jcmVhdG9ycz4KICA8dGl0bGVzPgogICAgPHRpdGxlPk1vZGVsIE1lbWJyYW5lIEZyb20gU2hlZCBTbmFrZSBTa2luczwvdGl0bGU+CiAgPC90aXRsZXM+CiAgPHB1Ymxpc2hlcj5aZW5vZG88L3B1Ymxpc2hlcj4KICA8cHVibGljYXRpb25ZZWFyPjIwMTM8L3B1YmxpY2F0aW9uWWVhcj4KICA8c3ViamVjdHM+CiAgICA8c3ViamVjdD5EU0M8L3N1YmplY3Q+CiAgICA8c3ViamVjdD5GVElSPC9zdWJqZWN0PgogICAgPHN1YmplY3Q+cGVybWVhdGlvbjwvc3ViamVjdD4KICAgIDxzdWJqZWN0PlNBWFM8L3N1YmplY3Q+CiAgICA8c3ViamVjdD5zaGVkIHNuYWtlIHNraW4uPC9zdWJqZWN0PgogIDwvc3ViamVjdHM+CiAgPGRhdGVzPgogICAgPGRhdGUgZGF0ZVR5cGU9Iklzc3VlZCI+MjAxMy0xMS0wNjwvZGF0ZT4KICA8L2RhdGVzPgogIDxsYW5ndWFnZT5lbjwvbGFuZ3VhZ2U+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJUZXh0Ij5Kb3VybmFsIGFydGljbGU8L3Jlc291cmNlVHlwZT4KICA8YWx0ZXJuYXRlSWRlbnRpZmllcnM+CiAgICA8YWx0ZXJuYXRlSWRlbnRpZmllciBhbHRlcm5hdGVJZGVudGlmaWVyVHlwZT0idXJsIj5odHRwczovL3plbm9kby5vcmcvcmVjb3JkLzEwLjUyODEvemVub2RvLjEwODkyMDQ8L2FsdGVybmF0ZUlkZW50aWZpZXI+CiAgPC9hbHRlcm5hdGVJZGVudGlmaWVycz4KICA8cmVsYXRlZElkZW50aWZpZXJzPgogICAgPHJlbGF0ZWRJZGVudGlmaWVyIHJlbGF0ZWRJZGVudGlmaWVyVHlwZT0iRE9JIiByZWxhdGlvblR5cGU9IklzUGFydE9mIj4xMC41MjgxL3plbm9kby4xMDg5MjAzPC9yZWxhdGVkSWRlbnRpZmllcj4KICA8L3JlbGF0ZWRJZGVudGlmaWVycz4KICA8dmVyc2lvbj45OTk2NjYxPC92ZXJzaW9uPgogIDxyaWdodHNMaXN0PgogICAgPHJpZ2h0cyByaWdodHNVUkk9Imh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS80LjAvIj5DcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDQuMDwvcmlnaHRzPgogICAgPHJpZ2h0cyByaWdodHNVUkk9ImluZm86ZXUtcmVwby9zZW1hbnRpY3Mvb3BlbkFjY2VzcyI+T3BlbiBBY2Nlc3M8L3JpZ2h0cz4KICA8L3JpZ2h0c0xpc3Q+CiAgPGRlc2NyaXB0aW9ucz4KICAgIDxkZXNjcmlwdGlvbiBkZXNjcmlwdGlvblR5cGU9IkFic3RyYWN0Ij4mbHQ7cCZndDtJbiB0aGlzIHByb2plY3Qgd2UgYXJlIGludGVyZXN0ZWQgaW4gc3R1ZHlpbmcgZGlmZmVyZW50IGtpbmRzIG9mIHNoZWQgc25ha2Ugc2tpbnMgaW4gb3JkZXIgdG8gYXBwbHkgdGhlbSBhcyBhIG1vZGVsIG1lbWJyYW5lIGZvciBwaGFybWFjZXV0aWNhbCBwdXJwb3NlcyBpbnN0ZWFkIG9mIGh1bWFuIHN0cmF0dW0gY29ybmV1bS4gTWFueSB0eXBlcyBvZiBzaGVkIHNuYWtlIHNraW5zIGFzIHdlbGwgYXMgbW9kZWwgZHJ1Z3Mgd2VyZSBzdHVkaWVkIGJ5IGRpZmZlcmVudCB0ZWNobmlxdWVzLiBUaGUgZGF0YSB3aWxsIGdpdmUgZGVlcGVyIHVuZGVyc3RhbmRpbmcgYWJvdXQgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gZHJ1Z3MgYW5kIG1vZGVsIG1lbWJyYW5lcyBhbmQgbWF5IGFsbG93IHVzIHRvIGNob29zZSB0aGUgc3VpdGFibGUgbW9kZWwgbWVtYnJhbmUgZm9yIHN0dWR5aW5nIHRoZSBlZmZlY3Qgb2YgcGhhcm1hY2V1dGljYWwgcHJvZHVjdHMuJmx0Oy9wJmd0OzwvZGVzY3JpcHRpb24+CiAgICA8ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJPdGhlciI+eyJyZWZlcmVuY2VzIjogWyJULiBOZ2F3aGlydW5wYXQsIFAuIE9wYW5hc29waXQsIFMuIFByYWtvbmdwYW4sIENvbXBhcmlzb24gb2Ygc2tpbiB0cmFuc3BvcnQgYW5kIG1ldGFib2xpc20gb2YgZXRoeWwgbmljb3RpbmF0ZSBpbiB2YXJpb3VzIHNwZWNpZXMuIEV1ciBKIFBoYXJtIEJpb3BoYXJtLCAyMDA0LCA1OCgzKSwgNjQ1LTUxLiIsICJULiBOZ2F3aGlydW5wYXQsIFMuIFBhbm9tc3VrLCBQLiBPcGFuYXNvcGl0LCBULiBSb2phbmFyYXRhLCBULiBIYXRhbmFrYSwgQ29tcGFyaXNvbiBvZiB0aGUgcGVyY3V0YW5lb3VzIGFic29ycHRpb24gb2YgaHlkcm9waGlsaWMgYW5kIGxpcG9waGlsaWMgY29tcG91bmRzIGluIHNoZWQgc25ha2Ugc2tpbiBhbmQgaHVtYW4gc2tpbi4uIFBoYXJtYXppZSwgMjAwNCwgNjEoNCksIDMzMS01IiwgIlQuIEl0b2gsIEouIFhpYSwgUi4gTWFnYXZpLCBULiBOaXNoaWhhdGEsIEguIFJ5dHRpbmcsIFVzZSBvZiBzaGVkIHNuYWtlIHNraW4gcyBtb2RlbCBtZW1icmFuZSBmb3IgcGVyY3V0YW5lb3VzIGFic29ycHRpb24gc3R1ZGllczsgY29tcGFyaXNvbiB3aXRoIGh1bWFuIHNraW4uIFBoYXJtYWNldXRpY2FsIFJlc2VhcmNoLCAxOTkwLCA3KDEwKSwgMTA0Mi03LiIsICJOLiBXb25nbGVydG5pcmFudCwgVC4gTmdhd2hpcnVucGF0LCBNLiBLdW1wdWdkZWUtVm9sbHJhdGgsIEV2YWx1YXRpb24gb2Ygc2tpbiBlbmhhbmNpbmcgbWVjaGFuaXNtIG9mIHN1cmZhY3RhbnRzIG9uIHRoZSBiaW9tZW1icmFuZSBmcm9tIHNoZWQgc25ha2Ugc2tpbiwgQmlvbG9naWNhbCAmYW1wOyBQaGFybWFjZXV0aWNhbCBCdWxsZXRpbiwgMjAxMiwgMzUoNCksIDEtOS4iLCAiQS4gTmFzZWRraW4sIEouIERhdmlkc3NvbiwgTS4gS3VtcHVnZGVlLVZvbGxyYXRoLCBEZXRlcm1pbmF0aW9uIG9mIG5hbm9zdHJ1Y3R1cmUgb2YgbGlwb3NvbWVzIGNvbnRhaW5pbmcgdHdvIG1vZGVsIGRydWdzIGJ5IFgtcmF5IHNjYXR0ZXJpbmcgZnJvbSBhIHN5bmNocm90cm9uIHNvdXJjZSwgSm91cm5hbCBvZiBTeW5jaHJvdHJvbiBSYWRpYXRpb24sIDIwMTMsIDIwLCA3MjEtNzI4LiIsICJILiBCaWxlaywgTi4gV29uZ2xlcnRuaXJhbnQsIFQuIE5nYXdoaXJ1bnBhdCwgUC4gT3BhbmFzb3BpdCwgTS4gS3VtcHVnZGVlLVZvbGxyYXRoLCBFZmZlY3Qgb2YgdGVycGVuZXMgb24gdGhlIHNraW4gcGVybWVhdGlvbiBvZiBrZXRvcHJvZmVuIHRocm91Z2ggc2hlZCBzbmFrZSBza2luLCBTaWxwYWtvcm4gVW5pdmVyc2l0eSBTY2llbmNlIGFuZCBUZWNobm9sb2d5IEpvdXJuYWwsIFNpbHBha29ybiBVbml2ZXJzaXR5IFB1Ymxpc2hlciwgMjAwOSwgMyAoMiksIDMzLTQxLiIsICJILiBCaWxlaywgTS4gS3VtcHVnZGVlIFZvbGxyYXRoLCBFbnR3aWNrbHVuZyBUcmFuc2Rlcm1hbGVyIERydWcgRGVsaXZlcnkgU3lzdGVtZSwgTmFjaGhhbHRpZ2UgRm9yc2NodW5nIGluIFdhY2hzdHVtc2JlcmVpY2hlbiBCYW5kIElJLCBCZXV0aCBIb2Noc2NodWxlIGZcdTAwZmNyIFRlY2huaWssIExvZ29zIFZlcmxhZyBCZXJsaW4sIDIwMTEsIDE1LTIwLiIsICJHLiBBaG1hZGksIFBoeXNpa2FsaXNjaCAtIGNoZW1pc2NoZSBVbnRlcnN1Y2h1bmdlbiB2b24gTW9kZWxsbWVtYnJhbmVuIGFtIEJlaXNwaWVsIGFiZ2V3b3JmZW5lciBTY2hsYW5nZW5oXHUwMGU0dXRlLCBCYWNoZWxvci1UaGVzaXMsIEJldXRoIEhvY2hzY2h1bGUgZlx1MDBmY3IgVGVjaG5payBCZXJsaW4gLSBVbml2ZXJzaXR5IG9mIEFwcGxpZWQgU2NpZW5jZXMsIEJlcmxpbiwgR2VybWFueSwgMjAxMy4iLCAiQS4gTmFpaywgWS4gTi4gS2FsaWEsIFIuIEguIEd1eSwgVHJhbnNkZXJtYWwgZHJ1ZyBkZWxpdmVyeTogb3ZlcmNvbWluZyB0aGUgc2tpbidzIGJhcnJpZXIgZnVuY3Rpb24sIFBTVFQsIDIwMDAsIDMgKDkpLCAzMTgtMzI2LiBcblsxMF1cdEguIEEuIEUuIEJlbnNvbiwgVHJhbnNkZXJtYWwgRHJ1ZyBEZWxpdmVyeTogUGVuZXRyYXRpb24gRW5oYW5jZW1lbnQgVGVjaG5pcXVlcywgQ3VycmVudCBEcnVnIERlbGl2ZXJ5LCAyMDA1LCAyLCAyMy0zMy4gXG5bMTFdXHRQLiBOLiBDcmFpZywgSW4gQ29tcHJlaGVuc2l2ZSBNZWRpY2luYWwgQ2hlbWlzdHJ5LCBDLiBIYW5zY2gsIFAuIEcuIFNhbW1lcywgSi4gQi4gVGF5bG9yLCBFZHMuLCBQZXJnYW1vbjogTmV3IFlvcmssIDE5OTAsIFZvbC4gNi5cblsxMl1cdEouSi4gU2hlbmcsIE4uQS4gS2FzaW0sIFIuIENoYW5kcmFzZWtoYXJhbiwgRy5MLiBBbWlkb24sIFNvbHViaWxpemF0aW9uIGFuZCBkaXNzb2x1dGlvbiBvZiBpbnNvbHVibGUgd2VhayBhY2lkLCBrZXRvcHJvZmVuOiBFZmZlY3RzIG9mIHBIIGNvbWJpbmVkIHdpdGggc3VyZmFjdGFudCwgRXVyLiBKLiBQaGFybS4sIDIwMDYsIDMwNi0zMTQuXG5bMTNdXHRFLiBCZWV0Z2UsIEouIGR1IFBsZXNzaXMsIEQuRy4gTXVsbGVyLCBDLiBHb29zZW4sIEYuSi4gdmFuIFJlbnNidXJnLCBUaGUgaW5mbHVlbmNlIG9mIHRoZSBwaHlzaWNvY2hlbWljYWwgY2hhcmFjdGVyaXN0aWNzIGFuZCBwaGFybWFjb2tpbmV0aWMgcHJvcGVydGllcyBvZiBzZWxlY3RlZCBOU0FJRCdzIG9uIHRoZWlyIHRyYW5zZGVybWFsIGFic29ycHRpb24sIEludC4gSi4gUGhhcm0uLCAyMDAwLCAyNjEtMjY0LlxuWzE0XVx0aHR0cDovL3d3dy5jaGVtYXhvbi5jb20vcHJvZHVjdHMvY2FsY3VsYXRvci1wbHVnaW5zL3Byb3BlcnR5LXByZWRpY3RvcnMvI3BrYSBjaXRlZCBvbiAxOCBTZXB0ZW1iZXIgMjAxM1xuWzE1XVx0aHR0cDovL3d3dy5zY2llbmNlZGlyZWN0LmNvbS9zY2llbmNlL2FydGljbGUvcGlpL1MwMzc4NTE3MzEwMDA0MTYzIGNpdGVkIG9uIDE4IFNlcHRlbWJlciAyMDEzXG5bMTZdXHRNLiBEZWFrLCBILiBGYWxrLCBPbiB0aGUgY2hlbWlzdHJ5IG9mIHJlc3ZlcmF0cm9sIGRpYXN0ZXJlb21lcnMuIE1vbmF0IGZ1ciBDaGVtLCAyMDAzLCAxMzQsIDg4My04ODguXG5bMTddXHRKLiBNLiBMXHUwMGYzcGV6LU5pY29sXHUwMGUxcywgRi4gR2FyY1x1MDBlZGEtQ2FybW9uYSwgQWdncmVnYXRpb24gU3RhdGUgYW5kIHBLYSBWYWx1ZXMgb2YgKEUpLVJlc3ZlcmF0cm9sIEFzIERldGVybWluZWQgYnkgRmx1b3Jlc2NlbmNlIFNwZWN0cm9zY29weSBhbmQgVVZcdTIyMTJWaXNpYmxlIEFic29ycHRpb24sIEouIEFncmljLiBGb29kIENoZW0uLCAyMDA4LCA1NiAoMTcpLCA3NjAwXHUyMDEzNzYwNS5cblsxOF1cdEguIFNqXHUwMGY2YmVyZywgSy4gS2FyYW1pLCBQLiBCZXJvbml1cywgTC4gU3VuZGVsb2YsIElvbml6YXRpb24gY29uZGl0aW9ucyBmb3IgaW9udG9waG9yZXRpYyBkcnVnIGRlbGl2ZXJ5LiBBIHJldmlzZWQgcEthIG9mIGxpZG9jYWluZSBoeWRyb2NobG9yaWRlIGluIGFxdWVvdXMgc29sdXRpb24gYXQgMjVcdTAwYjBDIGVzdGFibGlzaGVkIGJ5IHByZWNpc2lvbiBjb25kdWN0b21ldHJ5LCBJbnQuIEouIFBoYXJtLiwgMTk5NiwgMTQxLCA2My03MC5cblsxOV1cdGh0dHA6Ly93d3cuaWZuYS1pbnQub3JnL2lmbmEvZTEwN19maWxlcy9kb3dubG9hZHMvbGVjdHVyZXMvIEgxTG9jYWxBbmUucGRmIGNpdGVkIG9uIDI3IFNlcHRlbWJlciAyMDEzIl19PC9kZXNjcmlwdGlvbj4KICA8L2Rlc2NyaXB0aW9ucz4KPC9yZXNvdXJjZT4K'}, 'relationships': {'data-center': {'data': {'id': 'cern.zenodo', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cern', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.5281/zenodo.1089203', 'type': 'works', 'attributes': {'doi': '10.5281/zenodo.1089203', 'identifier': 'https://doi.org/10.5281/zenodo.1089203', 'url': None, 'author': [{'literal': 'M. Kumpugdee-Vollrath'}, {'literal': 'T. Subongkot'}, {'literal': 'T. Ngawhirunpat'}], 'title': 'Model Membrane From Shed Snake Skins', 'container-title': 'Zenodo', 'description': 'In this project we are interested in studying different kinds of shed snake skins in order to apply them as a model membrane for pharmaceutical purposes instead of human stratum corneum. Many types of shed snake skins as well as model drugs were studied by different techniques. The data will give deeper understanding about the interaction between drugs and model membranes and may allow us to choose the suitable model membrane for studying the effect of pharmaceutical products.', 'resource-type-subtype': 'Journal article', 'data-center-id': 'cern.zenodo', 'member-id': 'cern', 'resource-type-id': 'text', 'version': '9996661', 'license': 'https://creativecommons.org/licenses/by/4.0/', 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2013', 'registered': '2018-01-16T23:09:12Z', 'checked': None, 'updated': '2018-01-16T23:09:12Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPHJlc291cmNlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC0zL21ldGFkYXRhLnhzZCI+CiAgPGlkZW50aWZpZXIgaWRlbnRpZmllclR5cGU9IkRPSSI+MTAuNTI4MS96ZW5vZG8uMTA4OTIwMzwvaWRlbnRpZmllcj4KICA8Y3JlYXRvcnM+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPk0uIEt1bXB1Z2RlZS1Wb2xscmF0aDwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPlQuIFN1Ym9uZ2tvdDwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPlQuIE5nYXdoaXJ1bnBhdDwvY3JlYXRvck5hbWU+CiAgICA8L2NyZWF0b3I+CiAgPC9jcmVhdG9ycz4KICA8dGl0bGVzPgogICAgPHRpdGxlPk1vZGVsIE1lbWJyYW5lIEZyb20gU2hlZCBTbmFrZSBTa2luczwvdGl0bGU+CiAgPC90aXRsZXM+CiAgPHB1Ymxpc2hlcj5aZW5vZG88L3B1Ymxpc2hlcj4KICA8cHVibGljYXRpb25ZZWFyPjIwMTM8L3B1YmxpY2F0aW9uWWVhcj4KICA8c3ViamVjdHM+CiAgICA8c3ViamVjdD5EU0M8L3N1YmplY3Q+CiAgICA8c3ViamVjdD5GVElSPC9zdWJqZWN0PgogICAgPHN1YmplY3Q+cGVybWVhdGlvbjwvc3ViamVjdD4KICAgIDxzdWJqZWN0PlNBWFM8L3N1YmplY3Q+CiAgICA8c3ViamVjdD5zaGVkIHNuYWtlIHNraW4uPC9zdWJqZWN0PgogIDwvc3ViamVjdHM+CiAgPGRhdGVzPgogICAgPGRhdGUgZGF0ZVR5cGU9Iklzc3VlZCI+MjAxMy0xMS0wNjwvZGF0ZT4KICA8L2RhdGVzPgogIDxsYW5ndWFnZT5lbjwvbGFuZ3VhZ2U+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJUZXh0Ij5Kb3VybmFsIGFydGljbGU8L3Jlc291cmNlVHlwZT4KICA8YWx0ZXJuYXRlSWRlbnRpZmllcnM+CiAgICA8YWx0ZXJuYXRlSWRlbnRpZmllciBhbHRlcm5hdGVJZGVudGlmaWVyVHlwZT0idXJsIj5odHRwczovL3plbm9kby5vcmcvcmVjb3JkLzEwLjUyODEvemVub2RvLjEwODkyMDM8L2FsdGVybmF0ZUlkZW50aWZpZXI+CiAgPC9hbHRlcm5hdGVJZGVudGlmaWVycz4KICA8cmVsYXRlZElkZW50aWZpZXJzPgogICAgPHJlbGF0ZWRJZGVudGlmaWVyIHJlbGF0ZWRJZGVudGlmaWVyVHlwZT0iRE9JIiByZWxhdGlvblR5cGU9Ikhhc1BhcnQiPjEwLjUyODEvemVub2RvLjEwODkyMDQ8L3JlbGF0ZWRJZGVudGlmaWVyPgogIDwvcmVsYXRlZElkZW50aWZpZXJzPgogIDx2ZXJzaW9uPjk5OTY2NjE8L3ZlcnNpb24+CiAgPHJpZ2h0c0xpc3Q+CiAgICA8cmlnaHRzIHJpZ2h0c1VSST0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzQuMC8iPkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gNC4wPC9yaWdodHM+CiAgICA8cmlnaHRzIHJpZ2h0c1VSST0iaW5mbzpldS1yZXBvL3NlbWFudGljcy9vcGVuQWNjZXNzIj5PcGVuIEFjY2VzczwvcmlnaHRzPgogIDwvcmlnaHRzTGlzdD4KICA8ZGVzY3JpcHRpb25zPgogICAgPGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uVHlwZT0iQWJzdHJhY3QiPiZsdDtwJmd0O0luIHRoaXMgcHJvamVjdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBzdHVkeWluZyBkaWZmZXJlbnQga2luZHMgb2Ygc2hlZCBzbmFrZSBza2lucyBpbiBvcmRlciB0byBhcHBseSB0aGVtIGFzIGEgbW9kZWwgbWVtYnJhbmUgZm9yIHBoYXJtYWNldXRpY2FsIHB1cnBvc2VzIGluc3RlYWQgb2YgaHVtYW4gc3RyYXR1bSBjb3JuZXVtLiBNYW55IHR5cGVzIG9mIHNoZWQgc25ha2Ugc2tpbnMgYXMgd2VsbCBhcyBtb2RlbCBkcnVncyB3ZXJlIHN0dWRpZWQgYnkgZGlmZmVyZW50IHRlY2huaXF1ZXMuIFRoZSBkYXRhIHdpbGwgZ2l2ZSBkZWVwZXIgdW5kZXJzdGFuZGluZyBhYm91dCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBkcnVncyBhbmQgbW9kZWwgbWVtYnJhbmVzIGFuZCBtYXkgYWxsb3cgdXMgdG8gY2hvb3NlIHRoZSBzdWl0YWJsZSBtb2RlbCBtZW1icmFuZSBmb3Igc3R1ZHlpbmcgdGhlIGVmZmVjdCBvZiBwaGFybWFjZXV0aWNhbCBwcm9kdWN0cy4mbHQ7L3AmZ3Q7PC9kZXNjcmlwdGlvbj4KICAgIDxkZXNjcmlwdGlvbiBkZXNjcmlwdGlvblR5cGU9Ik90aGVyIj57InJlZmVyZW5jZXMiOiBbIlQuIE5nYXdoaXJ1bnBhdCwgUC4gT3BhbmFzb3BpdCwgUy4gUHJha29uZ3BhbiwgQ29tcGFyaXNvbiBvZiBza2luIHRyYW5zcG9ydCBhbmQgbWV0YWJvbGlzbSBvZiBldGh5bCBuaWNvdGluYXRlIGluIHZhcmlvdXMgc3BlY2llcy4gRXVyIEogUGhhcm0gQmlvcGhhcm0sIDIwMDQsIDU4KDMpLCA2NDUtNTEuIiwgIlQuIE5nYXdoaXJ1bnBhdCwgUy4gUGFub21zdWssIFAuIE9wYW5hc29waXQsIFQuIFJvamFuYXJhdGEsIFQuIEhhdGFuYWthLCBDb21wYXJpc29uIG9mIHRoZSBwZXJjdXRhbmVvdXMgYWJzb3JwdGlvbiBvZiBoeWRyb3BoaWxpYyBhbmQgbGlwb3BoaWxpYyBjb21wb3VuZHMgaW4gc2hlZCBzbmFrZSBza2luIGFuZCBodW1hbiBza2luLi4gUGhhcm1hemllLCAyMDA0LCA2MSg0KSwgMzMxLTUiLCAiVC4gSXRvaCwgSi4gWGlhLCBSLiBNYWdhdmksIFQuIE5pc2hpaGF0YSwgSC4gUnl0dGluZywgVXNlIG9mIHNoZWQgc25ha2Ugc2tpbiBzIG1vZGVsIG1lbWJyYW5lIGZvciBwZXJjdXRhbmVvdXMgYWJzb3JwdGlvbiBzdHVkaWVzOyBjb21wYXJpc29uIHdpdGggaHVtYW4gc2tpbi4gUGhhcm1hY2V1dGljYWwgUmVzZWFyY2gsIDE5OTAsIDcoMTApLCAxMDQyLTcuIiwgIk4uIFdvbmdsZXJ0bmlyYW50LCBULiBOZ2F3aGlydW5wYXQsIE0uIEt1bXB1Z2RlZS1Wb2xscmF0aCwgRXZhbHVhdGlvbiBvZiBza2luIGVuaGFuY2luZyBtZWNoYW5pc20gb2Ygc3VyZmFjdGFudHMgb24gdGhlIGJpb21lbWJyYW5lIGZyb20gc2hlZCBzbmFrZSBza2luLCBCaW9sb2dpY2FsICZhbXA7IFBoYXJtYWNldXRpY2FsIEJ1bGxldGluLCAyMDEyLCAzNSg0KSwgMS05LiIsICJBLiBOYXNlZGtpbiwgSi4gRGF2aWRzc29uLCBNLiBLdW1wdWdkZWUtVm9sbHJhdGgsIERldGVybWluYXRpb24gb2YgbmFub3N0cnVjdHVyZSBvZiBsaXBvc29tZXMgY29udGFpbmluZyB0d28gbW9kZWwgZHJ1Z3MgYnkgWC1yYXkgc2NhdHRlcmluZyBmcm9tIGEgc3luY2hyb3Ryb24gc291cmNlLCBKb3VybmFsIG9mIFN5bmNocm90cm9uIFJhZGlhdGlvbiwgMjAxMywgMjAsIDcyMS03MjguIiwgIkguIEJpbGVrLCBOLiBXb25nbGVydG5pcmFudCwgVC4gTmdhd2hpcnVucGF0LCBQLiBPcGFuYXNvcGl0LCBNLiBLdW1wdWdkZWUtVm9sbHJhdGgsIEVmZmVjdCBvZiB0ZXJwZW5lcyBvbiB0aGUgc2tpbiBwZXJtZWF0aW9uIG9mIGtldG9wcm9mZW4gdGhyb3VnaCBzaGVkIHNuYWtlIHNraW4sIFNpbHBha29ybiBVbml2ZXJzaXR5IFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kgSm91cm5hbCwgU2lscGFrb3JuIFVuaXZlcnNpdHkgUHVibGlzaGVyLCAyMDA5LCAzICgyKSwgMzMtNDEuIiwgIkguIEJpbGVrLCBNLiBLdW1wdWdkZWUgVm9sbHJhdGgsIEVudHdpY2tsdW5nIFRyYW5zZGVybWFsZXIgRHJ1ZyBEZWxpdmVyeSBTeXN0ZW1lLCBOYWNoaGFsdGlnZSBGb3JzY2h1bmcgaW4gV2FjaHN0dW1zYmVyZWljaGVuIEJhbmQgSUksIEJldXRoIEhvY2hzY2h1bGUgZlx1MDBmY3IgVGVjaG5paywgTG9nb3MgVmVybGFnIEJlcmxpbiwgMjAxMSwgMTUtMjAuIiwgIkcuIEFobWFkaSwgUGh5c2lrYWxpc2NoIC0gY2hlbWlzY2hlIFVudGVyc3VjaHVuZ2VuIHZvbiBNb2RlbGxtZW1icmFuZW4gYW0gQmVpc3BpZWwgYWJnZXdvcmZlbmVyIFNjaGxhbmdlbmhcdTAwZTR1dGUsIEJhY2hlbG9yLVRoZXNpcywgQmV1dGggSG9jaHNjaHVsZSBmXHUwMGZjciBUZWNobmlrIEJlcmxpbiAtIFVuaXZlcnNpdHkgb2YgQXBwbGllZCBTY2llbmNlcywgQmVybGluLCBHZXJtYW55LCAyMDEzLiIsICJBLiBOYWlrLCBZLiBOLiBLYWxpYSwgUi4gSC4gR3V5LCBUcmFuc2Rlcm1hbCBkcnVnIGRlbGl2ZXJ5OiBvdmVyY29taW5nIHRoZSBza2luJ3MgYmFycmllciBmdW5jdGlvbiwgUFNUVCwgMjAwMCwgMyAoOSksIDMxOC0zMjYuIFxuWzEwXVx0SC4gQS4gRS4gQmVuc29uLCBUcmFuc2Rlcm1hbCBEcnVnIERlbGl2ZXJ5OiBQZW5ldHJhdGlvbiBFbmhhbmNlbWVudCBUZWNobmlxdWVzLCBDdXJyZW50IERydWcgRGVsaXZlcnksIDIwMDUsIDIsIDIzLTMzLiBcblsxMV1cdFAuIE4uIENyYWlnLCBJbiBDb21wcmVoZW5zaXZlIE1lZGljaW5hbCBDaGVtaXN0cnksIEMuIEhhbnNjaCwgUC4gRy4gU2FtbWVzLCBKLiBCLiBUYXlsb3IsIEVkcy4sIFBlcmdhbW9uOiBOZXcgWW9yaywgMTk5MCwgVm9sLiA2LlxuWzEyXVx0Si5KLiBTaGVuZywgTi5BLiBLYXNpbSwgUi4gQ2hhbmRyYXNla2hhcmFuLCBHLkwuIEFtaWRvbiwgU29sdWJpbGl6YXRpb24gYW5kIGRpc3NvbHV0aW9uIG9mIGluc29sdWJsZSB3ZWFrIGFjaWQsIGtldG9wcm9mZW46IEVmZmVjdHMgb2YgcEggY29tYmluZWQgd2l0aCBzdXJmYWN0YW50LCBFdXIuIEouIFBoYXJtLiwgMjAwNiwgMzA2LTMxNC5cblsxM11cdEUuIEJlZXRnZSwgSi4gZHUgUGxlc3NpcywgRC5HLiBNdWxsZXIsIEMuIEdvb3NlbiwgRi5KLiB2YW4gUmVuc2J1cmcsIFRoZSBpbmZsdWVuY2Ugb2YgdGhlIHBoeXNpY29jaGVtaWNhbCBjaGFyYWN0ZXJpc3RpY3MgYW5kIHBoYXJtYWNva2luZXRpYyBwcm9wZXJ0aWVzIG9mIHNlbGVjdGVkIE5TQUlEJ3Mgb24gdGhlaXIgdHJhbnNkZXJtYWwgYWJzb3JwdGlvbiwgSW50LiBKLiBQaGFybS4sIDIwMDAsIDI2MS0yNjQuXG5bMTRdXHRodHRwOi8vd3d3LmNoZW1heG9uLmNvbS9wcm9kdWN0cy9jYWxjdWxhdG9yLXBsdWdpbnMvcHJvcGVydHktcHJlZGljdG9ycy8jcGthIGNpdGVkIG9uIDE4IFNlcHRlbWJlciAyMDEzXG5bMTVdXHRodHRwOi8vd3d3LnNjaWVuY2VkaXJlY3QuY29tL3NjaWVuY2UvYXJ0aWNsZS9waWkvUzAzNzg1MTczMTAwMDQxNjMgY2l0ZWQgb24gMTggU2VwdGVtYmVyIDIwMTNcblsxNl1cdE0uIERlYWssIEguIEZhbGssIE9uIHRoZSBjaGVtaXN0cnkgb2YgcmVzdmVyYXRyb2wgZGlhc3RlcmVvbWVycy4gTW9uYXQgZnVyIENoZW0sIDIwMDMsIDEzNCwgODgzLTg4OC5cblsxN11cdEouIE0uIExcdTAwZjNwZXotTmljb2xcdTAwZTFzLCBGLiBHYXJjXHUwMGVkYS1DYXJtb25hLCBBZ2dyZWdhdGlvbiBTdGF0ZSBhbmQgcEthIFZhbHVlcyBvZiAoRSktUmVzdmVyYXRyb2wgQXMgRGV0ZXJtaW5lZCBieSBGbHVvcmVzY2VuY2UgU3BlY3Ryb3Njb3B5IGFuZCBVVlx1MjIxMlZpc2libGUgQWJzb3JwdGlvbiwgSi4gQWdyaWMuIEZvb2QgQ2hlbS4sIDIwMDgsIDU2ICgxNyksIDc2MDBcdTIwMTM3NjA1LlxuWzE4XVx0SC4gU2pcdTAwZjZiZXJnLCBLLiBLYXJhbWksIFAuIEJlcm9uaXVzLCBMLiBTdW5kZWxvZiwgSW9uaXphdGlvbiBjb25kaXRpb25zIGZvciBpb250b3Bob3JldGljIGRydWcgZGVsaXZlcnkuIEEgcmV2aXNlZCBwS2Egb2YgbGlkb2NhaW5lIGh5ZHJvY2hsb3JpZGUgaW4gYXF1ZW91cyBzb2x1dGlvbiBhdCAyNVx1MDBiMEMgZXN0YWJsaXNoZWQgYnkgcHJlY2lzaW9uIGNvbmR1Y3RvbWV0cnksIEludC4gSi4gUGhhcm0uLCAxOTk2LCAxNDEsIDYzLTcwLlxuWzE5XVx0aHR0cDovL3d3dy5pZm5hLWludC5vcmcvaWZuYS9lMTA3X2ZpbGVzL2Rvd25sb2Fkcy9sZWN0dXJlcy8gSDFMb2NhbEFuZS5wZGYgY2l0ZWQgb24gMjcgU2VwdGVtYmVyIDIwMTMiXX08L2Rlc2NyaXB0aW9uPgogIDwvZGVzY3JpcHRpb25zPgo8L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'cern.zenodo', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cern', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.5281/zenodo.1082907', 'type': 'works', 'attributes': {'doi': '10.5281/zenodo.1082907', 'identifier': 'https://doi.org/10.5281/zenodo.1082907', 'url': None, 'author': [{'literal': 'Seif Dalilsafaei'}], 'title': 'Dynamic Analyze Of Snake Robot', 'container-title': 'Zenodo', 'description': 'Crawling movement as a motive mode seen in nature\nof some animals such as snakes possesses a specific syntactic and\ndynamic analysis. Serpentine robot designed by inspiration from\nnature and snake-s crawling motion, is regarded as a crawling robot.\nIn this paper, a serpentine robot with spiral motion model will be\nanalyzed. The purpose of this analysis is to calculate the vertical and\ntangential forces along snake-s body and to determine the parameters\naffecting on these forces. Two types of serpentine robots have been\ndesigned in order to examine the achieved relations explained below.', 'resource-type-subtype': 'Journal article', 'data-center-id': 'cern.zenodo', 'member-id': 'cern', 'resource-type-id': 'text', 'version': '14400', 'license': 'https://creativecommons.org/licenses/by/4.0/', 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2007', 'registered': '2018-01-17T13:35:00Z', 'checked': None, 'updated': '2018-01-17T13:35:00Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPHJlc291cmNlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC0zL21ldGFkYXRhLnhzZCI+CiAgPGlkZW50aWZpZXIgaWRlbnRpZmllclR5cGU9IkRPSSI+MTAuNTI4MS96ZW5vZG8uMTA4MjkwNzwvaWRlbnRpZmllcj4KICA8Y3JlYXRvcnM+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPlNlaWYgRGFsaWxzYWZhZWk8L2NyZWF0b3JOYW1lPgogICAgPC9jcmVhdG9yPgogIDwvY3JlYXRvcnM+CiAgPHRpdGxlcz4KICAgIDx0aXRsZT5EeW5hbWljIEFuYWx5emUgT2YgU25ha2UgUm9ib3Q8L3RpdGxlPgogIDwvdGl0bGVzPgogIDxwdWJsaXNoZXI+WmVub2RvPC9wdWJsaXNoZXI+CiAgPHB1YmxpY2F0aW9uWWVhcj4yMDA3PC9wdWJsaWNhdGlvblllYXI+CiAgPHN1YmplY3RzPgogICAgPHN1YmplY3Q+Rm9yY2U8L3N1YmplY3Q+CiAgICA8c3ViamVjdD5EeW5hbWljIGFuYWx5emU8L3N1YmplY3Q+CiAgICA8c3ViamVjdD5Kb2ludCBhbmQgU25ha2Ugcm9ib3QuPC9zdWJqZWN0PgogIDwvc3ViamVjdHM+CiAgPGRhdGVzPgogICAgPGRhdGUgZGF0ZVR5cGU9Iklzc3VlZCI+MjAwNy0wNS0yNDwvZGF0ZT4KICA8L2RhdGVzPgogIDxsYW5ndWFnZT5lbjwvbGFuZ3VhZ2U+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJUZXh0Ij5Kb3VybmFsIGFydGljbGU8L3Jlc291cmNlVHlwZT4KICA8YWx0ZXJuYXRlSWRlbnRpZmllcnM+CiAgICA8YWx0ZXJuYXRlSWRlbnRpZmllciBhbHRlcm5hdGVJZGVudGlmaWVyVHlwZT0idXJsIj5odHRwczovL3plbm9kby5vcmcvcmVjb3JkLzEwLjUyODEvemVub2RvLjEwODI5MDc8L2FsdGVybmF0ZUlkZW50aWZpZXI+CiAgPC9hbHRlcm5hdGVJZGVudGlmaWVycz4KICA8cmVsYXRlZElkZW50aWZpZXJzPgogICAgPHJlbGF0ZWRJZGVudGlmaWVyIHJlbGF0ZWRJZGVudGlmaWVyVHlwZT0iRE9JIiByZWxhdGlvblR5cGU9IklzUGFydE9mIj4xMC41MjgxL3plbm9kby4xMDgyOTA2PC9yZWxhdGVkSWRlbnRpZmllcj4KICA8L3JlbGF0ZWRJZGVudGlmaWVycz4KICA8dmVyc2lvbj4xNDQwMDwvdmVyc2lvbj4KICA8cmlnaHRzTGlzdD4KICAgIDxyaWdodHMgcmlnaHRzVVJJPSJodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvNC4wLyI+Q3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiA0LjA8L3JpZ2h0cz4KICAgIDxyaWdodHMgcmlnaHRzVVJJPSJpbmZvOmV1LXJlcG8vc2VtYW50aWNzL29wZW5BY2Nlc3MiPk9wZW4gQWNjZXNzPC9yaWdodHM+CiAgPC9yaWdodHNMaXN0PgogIDxkZXNjcmlwdGlvbnM+CiAgICA8ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJBYnN0cmFjdCI+Q3Jhd2xpbmcgbW92ZW1lbnQgYXMgYSBtb3RpdmUgbW9kZSBzZWVuIGluIG5hdHVyZQpvZiBzb21lIGFuaW1hbHMgc3VjaCBhcyBzbmFrZXMgcG9zc2Vzc2VzIGEgc3BlY2lmaWMgc3ludGFjdGljIGFuZApkeW5hbWljIGFuYWx5c2lzLiBTZXJwZW50aW5lIHJvYm90IGRlc2lnbmVkIGJ5IGluc3BpcmF0aW9uIGZyb20KbmF0dXJlIGFuZCBzbmFrZS1zIGNyYXdsaW5nIG1vdGlvbiwgaXMgcmVnYXJkZWQgYXMgYSBjcmF3bGluZyByb2JvdC4KSW4gdGhpcyBwYXBlciwgYSBzZXJwZW50aW5lIHJvYm90IHdpdGggc3BpcmFsIG1vdGlvbiBtb2RlbCB3aWxsIGJlCmFuYWx5emVkLiBUaGUgcHVycG9zZSBvZiB0aGlzIGFuYWx5c2lzIGlzIHRvIGNhbGN1bGF0ZSB0aGUgdmVydGljYWwgYW5kCnRhbmdlbnRpYWwgZm9yY2VzIGFsb25nIHNuYWtlLXMgYm9keSBhbmQgdG8gZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXJzCmFmZmVjdGluZyBvbiB0aGVzZSBmb3JjZXMuIFR3byB0eXBlcyBvZiBzZXJwZW50aW5lIHJvYm90cyBoYXZlIGJlZW4KZGVzaWduZWQgaW4gb3JkZXIgdG8gZXhhbWluZSB0aGUgYWNoaWV2ZWQgcmVsYXRpb25zIGV4cGxhaW5lZCBiZWxvdy48L2Rlc2NyaXB0aW9uPgogICAgPGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uVHlwZT0iT3RoZXIiPnsicmVmZXJlbmNlcyI6IFsiUy5IaXJvc2UgYW5kIEEuTW9yaXNoaW1hLCBEZXNpZ24gYW5kIGNvbnRyb2wgb2YgYSBtb2JpbGUgcm9ib3Qgd2l0aCBhbiBhcnRpY3VsYXRlZCBib2R5LCBJbnRlcm5hdGlvbmFsIEpvdXJuYWwgb2YgQWR2YW5jZWQgUm9ib3RpY3MsIDE5OTA5LCBwcCA5OS0xMTQuIiwgIk0gLkFudGhvbnkgYW5kIEQgLlplaG5wZmVubmluZyAsIEEgc25ha2UgbGlrZSByb2JvdCBmb3IgMy1EIHZpc3VhbCBpbnNwZWN0aW9uLCAxN3RoIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBJbmR1c3RyaWFsIHJvYm90LCAxOTg3LCBBcHJpbC4iLCAiSiAuR3JheSBhbmQgSCAuTGlzc21hbm4sIFRoZSBraW5lbWF0aWMgb2YgbG9jb21vdGlvbiBvZiB0aGUgZ3Jhc3Mgc25ha2UsIEludGVybmF0aW9uYWwgSm91cm5hbCBvZiBCaW9sb2dpY2FsLCAxOTUwLCBwcCAzNTQtMzY3LiIsICJNIC5OYWtoYWVpLCBBIC5NZWdoZGFyaSAsIE9wdGltaXphdGlvbiBvZiBzbmFrZSBtb3ZlbWVudCwzNXRoIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBtZWNoYW5pYywgaXJhbiwgMjAwMiwiLCAiRi4gTWF0c3VubyBhbmQgSy4gTW9naSwgUmVkdW5kYW5jeSBjb250cm9sbGFibGUgc3lzdGVtIGFuZHMgY29udHJvbCBvZiBhIHNuYWtlIHJvYm90cyBiYXNlZCBvbiBraW5lbWF0aWNzIG1vZGVsLCAzOXRoIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBEZWNpc2lvbiBhbmQgQ29udHJvbCAsIDIwMDAsIERlY2VtYmVyLiIsICJFIC5TaGFtbWFzLCBBIC5Xb2xmLCBCLkguIEJyb3duIGFuZCBIIC5DaG9zZXQsIEEgbmV3IGpvaW50IGRlc2lnbiBmb3IgdGhyZWUgZGltZW5zaW9uYWwgaHlwZXIgcmVkdW5kYW50IHJvYm90LCBJbnRlcm5hdGlvbmFsIENvbmZlcmVuY2Ugb24gSW50ZWxsaWdlbnQgUm9ib3RzIGFuZCBTeXN0ZW1zLCBMYXMgVmVnYXMsIDIwMDMuIiwgIk0uIE5ha2hhZWkgYW5kIEEgTWVnaGRhcmksIE1vdGlvbiBwbGFubmluZyBhbmQgc2ltdWxhdGlvbiBvZiBjcmVlcGluZyByb2JvdCBvbiBzbG9wZSwgSm91cm5hbCBvZiBzY2llbmNlIGFuZCB0ZWNobm9sb2d5LCAyMDA1LiIsICJSLiBQYWxqdWcsIFQgLk9obSBhbmQgUyAuSGF5YXRpICxUaGUgSlBMIHNlcnBlbnRpbmUgcm9ib3QgOiBhIDEyIERPRiBzeXN0ZW0gZm9yIGluc3BlY3Rpb24gLCBJRUVFIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBSb2JvdGljcyBhbmQgQXV0b21hdGlvbiwgMTk5NS4iLCAid3d3LnZvcm9ub2kuY29tIGFuZCB3d3cuc25ha2Vyb2JvdHMuY29tIC4gIFsxMF0gQS4gV29sZiAsIEguQi4gQnJvd24sIFIuIENhc2Npb2xhICwgQSAuQ29zdGEgLCBFIC5TaGFtbWFzIGFuZCBILkNob3NldCwgQSBtb2JpbGUgaHlwZXIgcmVkdW5kYW50IG1lY2hhbmlzbSBmb3Igc2VhcmNoIGFuZCByZXNjdWUgdGFza3MsIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBJbnRlbGxpZ2VudCBSb2JvdHMgYW5kIFN5c3RlbXMsIExhcyBWZWdhcywgTmV2YWRhLCAyMDAzLiBbMTFdIFkuIE1hc3Nhc2hpLCBTZXJwZW50aW5lIGxvY29tb3Rpb24gd2l0aCByb2JvdGljIHNuYWtlcywgSUVFRSBKb3VybmFsIG9mIENvbnRyb2wgU3lzdGVtLCAyMDAyLiBbMTJdIFkuIFVtZXRhbmksIE1lY2hhbmlzbSBhbmQgY29udHJvbCBvZiBTZXJwZW50aW5lIG1vdmVtZW50LCBJbnRlcm5hdGlvbmFsIEJpb21lY2hhbmlzbSBTeW1wb3NpdW0sIDIwMDQsIHBwIDI1My0yNjAuIFsxM10gSy4gRG93bGluZywgTGltYmxlc3MgbG9jb21vdGlvbjogbGVhcm5pbmcgdG8gY3Jhd2wsIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBSb2JvdGljcyBhbmQgQXV0b21hdGlvbiwgMTk5OS4gWzE0XSBKLiBSaWNrLCBKLiBSYWRmb3JkIGFuZCBHIC5DaGlyaWNramlhbiAsIEEgc2lkZSBXaW5kaW5nIGxvY29tb3Rpb24gZ2FpdCBmb3IgaHlwZXIgcmVkdW5kYW50IHJvYm90LCBJbnRlcm5hdGlvbmFsIEpvdXJuYWwgb2YgQWR2YW5jZWQgUm9ib3RpY3MsIDE5OTUuIFsxNV0gTSAvTW9yaSBhbmQgUy4gSGlyb3NlLCBEZXZlbG9wbWVudCBvZiBhY3RpdmUgY29yZCBtZWNoYW5pc20gQUNNLVIzIHdpdGggYWdpbGUgMy1EIG1vYmlsaXR5LCBJbnRlcm5hdGlvbmFsIENvbmZlcmVuY2Ugb24gSW50ZWxsaW5nIFJvYm90aWNzIGFuZCBTeXN0ZW1zLEhhd2FpaSwgMjAwMS4gWzE2XSBTIC5IaXJvc2UsIEJpb2xvZ2ljYWxseSBJbnNwaXJlZCBSb2JvdHM6IFNuYWtlIExpa2UgTG9jb21vdG9ycyBhbmQgTWFuaXB1bGF0b3JzLCBPeGZvcmQgVW5pdmVyc2l0eSwgMTk5My4iXX08L2Rlc2NyaXB0aW9uPgogIDwvZGVzY3JpcHRpb25zPgo8L3Jlc291cmNlPgo='}, 'relationships': {'data-center': {'data': {'id': 'cern.zenodo', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cern', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}, {'id': 'https://doi.org/10.5281/zenodo.1082906', 'type': 'works', 'attributes': {'doi': '10.5281/zenodo.1082906', 'identifier': 'https://doi.org/10.5281/zenodo.1082906', 'url': None, 'author': [{'literal': 'Seif Dalilsafaei'}], 'title': 'Dynamic Analyze Of Snake Robot', 'container-title': 'Zenodo', 'description': 'Crawling movement as a motive mode seen in nature\nof some animals such as snakes possesses a specific syntactic and\ndynamic analysis. Serpentine robot designed by inspiration from\nnature and snake-s crawling motion, is regarded as a crawling robot.\nIn this paper, a serpentine robot with spiral motion model will be\nanalyzed. The purpose of this analysis is to calculate the vertical and\ntangential forces along snake-s body and to determine the parameters\naffecting on these forces. Two types of serpentine robots have been\ndesigned in order to examine the achieved relations explained below.', 'resource-type-subtype': 'Journal article', 'data-center-id': 'cern.zenodo', 'member-id': 'cern', 'resource-type-id': 'text', 'version': '14400', 'license': 'https://creativecommons.org/licenses/by/4.0/', 'schema-version': '3', 'results': [], 'related-identifiers': [], 'published': '2007', 'registered': '2018-01-17T13:35:01Z', 'checked': None, 'updated': '2018-01-17T13:35:01Z', 'media': None, 'xml': 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPHJlc291cmNlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtMyBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC0zL21ldGFkYXRhLnhzZCI+CiAgPGlkZW50aWZpZXIgaWRlbnRpZmllclR5cGU9IkRPSSI+MTAuNTI4MS96ZW5vZG8uMTA4MjkwNjwvaWRlbnRpZmllcj4KICA8Y3JlYXRvcnM+CiAgICA8Y3JlYXRvcj4KICAgICAgPGNyZWF0b3JOYW1lPlNlaWYgRGFsaWxzYWZhZWk8L2NyZWF0b3JOYW1lPgogICAgPC9jcmVhdG9yPgogIDwvY3JlYXRvcnM+CiAgPHRpdGxlcz4KICAgIDx0aXRsZT5EeW5hbWljIEFuYWx5emUgT2YgU25ha2UgUm9ib3Q8L3RpdGxlPgogIDwvdGl0bGVzPgogIDxwdWJsaXNoZXI+WmVub2RvPC9wdWJsaXNoZXI+CiAgPHB1YmxpY2F0aW9uWWVhcj4yMDA3PC9wdWJsaWNhdGlvblllYXI+CiAgPHN1YmplY3RzPgogICAgPHN1YmplY3Q+Rm9yY2U8L3N1YmplY3Q+CiAgICA8c3ViamVjdD5EeW5hbWljIGFuYWx5emU8L3N1YmplY3Q+CiAgICA8c3ViamVjdD5Kb2ludCBhbmQgU25ha2Ugcm9ib3QuPC9zdWJqZWN0PgogIDwvc3ViamVjdHM+CiAgPGRhdGVzPgogICAgPGRhdGUgZGF0ZVR5cGU9Iklzc3VlZCI+MjAwNy0wNS0yNDwvZGF0ZT4KICA8L2RhdGVzPgogIDxsYW5ndWFnZT5lbjwvbGFuZ3VhZ2U+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJUZXh0Ij5Kb3VybmFsIGFydGljbGU8L3Jlc291cmNlVHlwZT4KICA8YWx0ZXJuYXRlSWRlbnRpZmllcnM+CiAgICA8YWx0ZXJuYXRlSWRlbnRpZmllciBhbHRlcm5hdGVJZGVudGlmaWVyVHlwZT0idXJsIj5odHRwczovL3plbm9kby5vcmcvcmVjb3JkLzEwLjUyODEvemVub2RvLjEwODI5MDY8L2FsdGVybmF0ZUlkZW50aWZpZXI+CiAgPC9hbHRlcm5hdGVJZGVudGlmaWVycz4KICA8cmVsYXRlZElkZW50aWZpZXJzPgogICAgPHJlbGF0ZWRJZGVudGlmaWVyIHJlbGF0ZWRJZGVudGlmaWVyVHlwZT0iRE9JIiByZWxhdGlvblR5cGU9Ikhhc1BhcnQiPjEwLjUyODEvemVub2RvLjEwODI5MDc8L3JlbGF0ZWRJZGVudGlmaWVyPgogIDwvcmVsYXRlZElkZW50aWZpZXJzPgogIDx2ZXJzaW9uPjE0NDAwPC92ZXJzaW9uPgogIDxyaWdodHNMaXN0PgogICAgPHJpZ2h0cyByaWdodHNVUkk9Imh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS80LjAvIj5DcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDQuMDwvcmlnaHRzPgogICAgPHJpZ2h0cyByaWdodHNVUkk9ImluZm86ZXUtcmVwby9zZW1hbnRpY3Mvb3BlbkFjY2VzcyI+T3BlbiBBY2Nlc3M8L3JpZ2h0cz4KICA8L3JpZ2h0c0xpc3Q+CiAgPGRlc2NyaXB0aW9ucz4KICAgIDxkZXNjcmlwdGlvbiBkZXNjcmlwdGlvblR5cGU9IkFic3RyYWN0Ij5DcmF3bGluZyBtb3ZlbWVudCBhcyBhIG1vdGl2ZSBtb2RlIHNlZW4gaW4gbmF0dXJlCm9mIHNvbWUgYW5pbWFscyBzdWNoIGFzIHNuYWtlcyBwb3NzZXNzZXMgYSBzcGVjaWZpYyBzeW50YWN0aWMgYW5kCmR5bmFtaWMgYW5hbHlzaXMuIFNlcnBlbnRpbmUgcm9ib3QgZGVzaWduZWQgYnkgaW5zcGlyYXRpb24gZnJvbQpuYXR1cmUgYW5kIHNuYWtlLXMgY3Jhd2xpbmcgbW90aW9uLCBpcyByZWdhcmRlZCBhcyBhIGNyYXdsaW5nIHJvYm90LgpJbiB0aGlzIHBhcGVyLCBhIHNlcnBlbnRpbmUgcm9ib3Qgd2l0aCBzcGlyYWwgbW90aW9uIG1vZGVsIHdpbGwgYmUKYW5hbHl6ZWQuIFRoZSBwdXJwb3NlIG9mIHRoaXMgYW5hbHlzaXMgaXMgdG8gY2FsY3VsYXRlIHRoZSB2ZXJ0aWNhbCBhbmQKdGFuZ2VudGlhbCBmb3JjZXMgYWxvbmcgc25ha2UtcyBib2R5IGFuZCB0byBkZXRlcm1pbmUgdGhlIHBhcmFtZXRlcnMKYWZmZWN0aW5nIG9uIHRoZXNlIGZvcmNlcy4gVHdvIHR5cGVzIG9mIHNlcnBlbnRpbmUgcm9ib3RzIGhhdmUgYmVlbgpkZXNpZ25lZCBpbiBvcmRlciB0byBleGFtaW5lIHRoZSBhY2hpZXZlZCByZWxhdGlvbnMgZXhwbGFpbmVkIGJlbG93LjwvZGVzY3JpcHRpb24+CiAgICA8ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJPdGhlciI+eyJyZWZlcmVuY2VzIjogWyJTLkhpcm9zZSBhbmQgQS5Nb3Jpc2hpbWEsIERlc2lnbiBhbmQgY29udHJvbCBvZiBhIG1vYmlsZSByb2JvdCB3aXRoIGFuIGFydGljdWxhdGVkIGJvZHksIEludGVybmF0aW9uYWwgSm91cm5hbCBvZiBBZHZhbmNlZCBSb2JvdGljcywgMTk5MDksIHBwIDk5LTExNC4iLCAiTSAuQW50aG9ueSBhbmQgRCAuWmVobnBmZW5uaW5nICwgQSBzbmFrZSBsaWtlIHJvYm90IGZvciAzLUQgdmlzdWFsIGluc3BlY3Rpb24sIDE3dGggSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIEluZHVzdHJpYWwgcm9ib3QsIDE5ODcsIEFwcmlsLiIsICJKIC5HcmF5IGFuZCBIIC5MaXNzbWFubiwgVGhlIGtpbmVtYXRpYyBvZiBsb2NvbW90aW9uIG9mIHRoZSBncmFzcyBzbmFrZSwgSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIEJpb2xvZ2ljYWwsIDE5NTAsIHBwIDM1NC0zNjcuIiwgIk0gLk5ha2hhZWksIEEgLk1lZ2hkYXJpICwgT3B0aW1pemF0aW9uIG9mIHNuYWtlIG1vdmVtZW50LDM1dGggSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIG1lY2hhbmljLCBpcmFuLCAyMDAyLCIsICJGLiBNYXRzdW5vIGFuZCBLLiBNb2dpLCBSZWR1bmRhbmN5IGNvbnRyb2xsYWJsZSBzeXN0ZW0gYW5kcyBjb250cm9sIG9mIGEgc25ha2Ugcm9ib3RzIGJhc2VkIG9uIGtpbmVtYXRpY3MgbW9kZWwsIDM5dGggSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIERlY2lzaW9uIGFuZCBDb250cm9sICwgMjAwMCwgRGVjZW1iZXIuIiwgIkUgLlNoYW1tYXMsIEEgLldvbGYsIEIuSC4gQnJvd24gYW5kIEggLkNob3NldCwgQSBuZXcgam9pbnQgZGVzaWduIGZvciB0aHJlZSBkaW1lbnNpb25hbCBoeXBlciByZWR1bmRhbnQgcm9ib3QsIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBJbnRlbGxpZ2VudCBSb2JvdHMgYW5kIFN5c3RlbXMsIExhcyBWZWdhcywgMjAwMy4iLCAiTS4gTmFraGFlaSBhbmQgQSBNZWdoZGFyaSwgTW90aW9uIHBsYW5uaW5nIGFuZCBzaW11bGF0aW9uIG9mIGNyZWVwaW5nIHJvYm90IG9uIHNsb3BlLCBKb3VybmFsIG9mIHNjaWVuY2UgYW5kIHRlY2hub2xvZ3ksIDIwMDUuIiwgIlIuIFBhbGp1ZywgVCAuT2htIGFuZCBTIC5IYXlhdGkgLFRoZSBKUEwgc2VycGVudGluZSByb2JvdCA6IGEgMTIgRE9GIHN5c3RlbSBmb3IgaW5zcGVjdGlvbiAsIElFRUUgSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIFJvYm90aWNzIGFuZCBBdXRvbWF0aW9uLCAxOTk1LiIsICJ3d3cudm9yb25vaS5jb20gYW5kIHd3dy5zbmFrZXJvYm90cy5jb20gLiAgWzEwXSBBLiBXb2xmICwgSC5CLiBCcm93biwgUi4gQ2FzY2lvbGEgLCBBIC5Db3N0YSAsIEUgLlNoYW1tYXMgYW5kIEguQ2hvc2V0LCBBIG1vYmlsZSBoeXBlciByZWR1bmRhbnQgbWVjaGFuaXNtIGZvciBzZWFyY2ggYW5kIHJlc2N1ZSB0YXNrcywgSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIEludGVsbGlnZW50IFJvYm90cyBhbmQgU3lzdGVtcywgTGFzIFZlZ2FzLCBOZXZhZGEsIDIwMDMuIFsxMV0gWS4gTWFzc2FzaGksIFNlcnBlbnRpbmUgbG9jb21vdGlvbiB3aXRoIHJvYm90aWMgc25ha2VzLCBJRUVFIEpvdXJuYWwgb2YgQ29udHJvbCBTeXN0ZW0sIDIwMDIuIFsxMl0gWS4gVW1ldGFuaSwgTWVjaGFuaXNtIGFuZCBjb250cm9sIG9mIFNlcnBlbnRpbmUgbW92ZW1lbnQsIEludGVybmF0aW9uYWwgQmlvbWVjaGFuaXNtIFN5bXBvc2l1bSwgMjAwNCwgcHAgMjUzLTI2MC4gWzEzXSBLLiBEb3dsaW5nLCBMaW1ibGVzcyBsb2NvbW90aW9uOiBsZWFybmluZyB0byBjcmF3bCwgSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIFJvYm90aWNzIGFuZCBBdXRvbWF0aW9uLCAxOTk5LiBbMTRdIEouIFJpY2ssIEouIFJhZGZvcmQgYW5kIEcgLkNoaXJpY2tqaWFuICwgQSBzaWRlIFdpbmRpbmcgbG9jb21vdGlvbiBnYWl0IGZvciBoeXBlciByZWR1bmRhbnQgcm9ib3QsIEludGVybmF0aW9uYWwgSm91cm5hbCBvZiBBZHZhbmNlZCBSb2JvdGljcywgMTk5NS4gWzE1XSBNIC9Nb3JpIGFuZCBTLiBIaXJvc2UsIERldmVsb3BtZW50IG9mIGFjdGl2ZSBjb3JkIG1lY2hhbmlzbSBBQ00tUjMgd2l0aCBhZ2lsZSAzLUQgbW9iaWxpdHksIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBJbnRlbGxpbmcgUm9ib3RpY3MgYW5kIFN5c3RlbXMsSGF3YWlpLCAyMDAxLiBbMTZdIFMgLkhpcm9zZSwgQmlvbG9naWNhbGx5IEluc3BpcmVkIFJvYm90czogU25ha2UgTGlrZSBMb2NvbW90b3JzIGFuZCBNYW5pcHVsYXRvcnMsIE94Zm9yZCBVbml2ZXJzaXR5LCAxOTkzLiJdfTwvZGVzY3JpcHRpb24+CiAgPC9kZXNjcmlwdGlvbnM+CjwvcmVzb3VyY2U+Cg=='}, 'relationships': {'data-center': {'data': {'id': 'cern.zenodo', 'type': 'data-centers'}}, 'member': {'data': {'id': 'cern', 'type': 'members'}}, 'resource-type': {'data': {'id': 'text', 'type': 'resource-types'}}}}], 'meta': {'resource-types': [{'id': 'dataset', 'title': 'Dataset', 'count': 729}, {'id': 'image', 'title': 'Image', 'count': 554}, {'id': 'text', 'title': 'Text', 'count': 532}, {'id': 'collection', 'title': 'Collection', 'count': 164}, {'id': 'audiovisual', 'title': 'Audiovisual', 'count': 26}, {'id': 'other', 'title': 'Other', 'count': 24}, {'id': 'software', 'title': 'Software', 'count': 17}, {'id': 'event', 'title': 'Event', 'count': 1}, {'id': 'film', 'title': 'Film', 'count': 1}, {'id': 'model', 'title': 'Model', 'count': 1}, {'id': 'physical-object', 'title': 'Physical object', 'count': 1}], 'years': [{'id': '2018', 'title': '2018', 'count': 175}, {'id': '2017', 'title': '2017', 'count': 485}, {'id': '2016', 'title': '2016', 'count': 313}, {'id': '2015', 'title': '2015', 'count': 267}, {'id': '2014', 'title': '2014', 'count': 104}, {'id': '2013', 'title': '2013', 'count': 100}, {'id': '2012', 'title': '2012', 'count': 82}, {'id': '2011', 'title': '2011', 'count': 94}, {'id': '2010', 'title': '2010', 'count': 68}, {'id': '2009', 'title': '2009', 'count': 56}, {'id': '2008', 'title': '2008', 'count': 37}, {'id': '2007', 'title': '2007', 'count': 61}, {'id': '2006', 'title': '2006', 'count': 34}, {'id': '2005', 'title': '2005', 'count': 30}, {'id': '1938', 'title': '1938', 'count': 23}], 'registered': [{'id': '2018', 'title': '2018', 'count': 280}, {'id': '2017', 'title': '2017', 'count': 745}, {'id': '2016', 'title': '2016', 'count': 646}, {'id': '2015', 'title': '2015', 'count': 191}, {'id': '2014', 'title': '2014', 'count': 102}, {'id': '2013', 'title': '2013', 'count': 134}, {'id': '2012', 'title': '2012', 'count': 40}, {'id': '2011', 'title': '2011', 'count': 17}, {'id': '2010', 'title': '2010', 'count': 23}, {'id': '2009', 'title': '2009', 'count': 2}, {'id': '2008', 'title': '2008', 'count': 2}, {'id': '2007', 'title': '2007', 'count': 4}], 'data_centers': [{'id': 'cern.zenodo', 'title': 'ZENODO - Research. Shared.', 'count': 556}, {'id': 'dk.gbif', 'title': 'Global Biodiversity Information Facility', 'count': 425}, {'id': 'figshare.ars', 'title': 'figshare Academic Research System', 'count': 358}, {'id': 'cdl.dryad', 'title': 'Dryad', 'count': 151}, {'id': 'cdl.ucbmvz', 'title': 'UC Berkeley Museum of Vertebrate Zoology', 'count': 104}, {'id': 'rg.rg', 'title': 'ResearchGate', 'count': 100}, {'id': 'ands.centre72', 'title': 'PARADISEC', 'count': 43}, {'id': 'cisti.ubc', 'title': 'University of British Columbia', 'count': 37}, {'id': 'cdl.rutgers', 'title': 'Rutgers University Library', 'count': 36}, {'id': 'cdl.dtic', 'title': 'Defense Technical Information Center (DTIC)', 'count': 31}, {'id': 'crui.unifi', 'title': 'Università degli Studi di Firenze', 'count': 23}, {'id': 'tib.pangaea', 'title': 'PANGAEA', 'count': 20}, {'id': 'osti.nrel', 'title': 'National Renewable Energy Laboratory (NREL)', 'count': 15}, {'id': 'cern.jacow', 'title': 'JACOW', 'count': 13}, {'id': 'bl.cam', 'title': 'University of Cambridge', 'count': 13}], 'schema-versions': [{'id': '4', 'title': 'Schema 4', 'count': 162}, {'id': '3', 'title': 'Schema 3', 'count': 1904}, {'id': '2.2', 'title': 'Schema 2.2', 'count': 119}, {'id': '2.1', 'title': 'Schema 2.1', 'count': 1}], 'total': 2186, 'total_pages': 88, 'page': 1}}

Printing out the data alone isn't that helpful. Sometimes there will be nice documentation about what you can expect in the data structure, but sometimes even if you have that you'll still need to do quite a bit of exploration to get the hang of things.

In our case here we have json file that serves up two keys: the data records all together and then metadata about that json file itself. This is a pretty common way to do this.

In [77]:
print(data.keys())
dict_keys(['data', 'meta'])

We can see the names of the keys here, so let's try to look into the meta area. Remember that there's no slicing here, but we still use the []. Instead of a position number we provide the key.

In [78]:
print(data['meta'])
{'resource-types': [{'id': 'dataset', 'title': 'Dataset', 'count': 729}, {'id': 'image', 'title': 'Image', 'count': 554}, {'id': 'text', 'title': 'Text', 'count': 532}, {'id': 'collection', 'title': 'Collection', 'count': 164}, {'id': 'audiovisual', 'title': 'Audiovisual', 'count': 26}, {'id': 'other', 'title': 'Other', 'count': 24}, {'id': 'software', 'title': 'Software', 'count': 17}, {'id': 'event', 'title': 'Event', 'count': 1}, {'id': 'film', 'title': 'Film', 'count': 1}, {'id': 'model', 'title': 'Model', 'count': 1}, {'id': 'physical-object', 'title': 'Physical object', 'count': 1}], 'years': [{'id': '2018', 'title': '2018', 'count': 175}, {'id': '2017', 'title': '2017', 'count': 485}, {'id': '2016', 'title': '2016', 'count': 313}, {'id': '2015', 'title': '2015', 'count': 267}, {'id': '2014', 'title': '2014', 'count': 104}, {'id': '2013', 'title': '2013', 'count': 100}, {'id': '2012', 'title': '2012', 'count': 82}, {'id': '2011', 'title': '2011', 'count': 94}, {'id': '2010', 'title': '2010', 'count': 68}, {'id': '2009', 'title': '2009', 'count': 56}, {'id': '2008', 'title': '2008', 'count': 37}, {'id': '2007', 'title': '2007', 'count': 61}, {'id': '2006', 'title': '2006', 'count': 34}, {'id': '2005', 'title': '2005', 'count': 30}, {'id': '1938', 'title': '1938', 'count': 23}], 'registered': [{'id': '2018', 'title': '2018', 'count': 280}, {'id': '2017', 'title': '2017', 'count': 745}, {'id': '2016', 'title': '2016', 'count': 646}, {'id': '2015', 'title': '2015', 'count': 191}, {'id': '2014', 'title': '2014', 'count': 102}, {'id': '2013', 'title': '2013', 'count': 134}, {'id': '2012', 'title': '2012', 'count': 40}, {'id': '2011', 'title': '2011', 'count': 17}, {'id': '2010', 'title': '2010', 'count': 23}, {'id': '2009', 'title': '2009', 'count': 2}, {'id': '2008', 'title': '2008', 'count': 2}, {'id': '2007', 'title': '2007', 'count': 4}], 'data_centers': [{'id': 'cern.zenodo', 'title': 'ZENODO - Research. Shared.', 'count': 556}, {'id': 'dk.gbif', 'title': 'Global Biodiversity Information Facility', 'count': 425}, {'id': 'figshare.ars', 'title': 'figshare Academic Research System', 'count': 358}, {'id': 'cdl.dryad', 'title': 'Dryad', 'count': 151}, {'id': 'cdl.ucbmvz', 'title': 'UC Berkeley Museum of Vertebrate Zoology', 'count': 104}, {'id': 'rg.rg', 'title': 'ResearchGate', 'count': 100}, {'id': 'ands.centre72', 'title': 'PARADISEC', 'count': 43}, {'id': 'cisti.ubc', 'title': 'University of British Columbia', 'count': 37}, {'id': 'cdl.rutgers', 'title': 'Rutgers University Library', 'count': 36}, {'id': 'cdl.dtic', 'title': 'Defense Technical Information Center (DTIC)', 'count': 31}, {'id': 'crui.unifi', 'title': 'Università degli Studi di Firenze', 'count': 23}, {'id': 'tib.pangaea', 'title': 'PANGAEA', 'count': 20}, {'id': 'osti.nrel', 'title': 'National Renewable Energy Laboratory (NREL)', 'count': 15}, {'id': 'cern.jacow', 'title': 'JACOW', 'count': 13}, {'id': 'bl.cam', 'title': 'University of Cambridge', 'count': 13}], 'schema-versions': [{'id': '4', 'title': 'Schema 4', 'count': 162}, {'id': '3', 'title': 'Schema 3', 'count': 1904}, {'id': '2.2', 'title': 'Schema 2.2', 'count': 119}, {'id': '2.1', 'title': 'Schema 2.1', 'count': 1}], 'total': 2186, 'total_pages': 88, 'page': 1}

Looks like there's another dictionary of data inside there. So we can look at the keys inside this sub dictionary.

In [79]:
print(data['meta'].keys())
dict_keys(['resource-types', 'years', 'registered', 'data_centers', 'schema-versions', 'total', 'total_pages', 'page'])

There's more stuff here that look like actual data points. So we can start exctracting things! We'll need to talk a bit about the mind's eye perspective of stacking up these extractions. Note that these results are numbers but don't have units. We will still be dependent on documentation and a well known exemplar to put things together and fully understand the meaning of things.

In [80]:
print(data['meta']['total_pages'])
88
In [81]:
print(data['meta']['page'])
1
In [82]:
print(data['meta']['total'])
2186

At this point we know enough to pull things together and make a nice little program that will loop through these pages and download however many they are. We may or may not really want to unpack this program.

In [47]:
import requests
import json
import time
import os.path
import os

term = "snake"
searchurl = "https://api.datacite.org/works?query=" + term
data = json.loads(requests.get(searchurl).text)
    
total_records = data['meta']['total']
current_page = data['meta']['page']
total_pages = data['meta']['total_pages']

zfilllen = len(str(total_pages))

if os.path.isdir(term + '/'):
    print("folder already exists")
else:
    print("making folder")
    os.mkdir(term)

for i in range(1, total_pages + 1):
    url = "https://api.datacite.org/works?query=" + term + "&page[number]=" + str(i)
    data = response = requests.get(url).text ## LOL
    with open(term + "/" + 'results_page_' + str(i).zfill(zfilllen) + '.json', 'w') as fout:
        fout.write(data)
    time.sleep(5)
making folder

Below is a program tha will loop through the payload files and extract out the XML. I've made a function here that will take the path for a file and returns a dictionary.

The idea here is to be able to write out the XMLs to separate files. The payload files have about 25 records each, so the unpack function will be called once per record file and give back all the individual results in there. While we're still in that run of the for loop, we'll de a subloop to open up that dictionary of the individual records and write out those files.

What's passed back is a list of tuples. Each tuple is a pair, where the first element is the DOI for that record that's sanitized for use as a file name. I'm not checking for duplicates in here because by their nature, the DOI needs to be unique across the entire universe of DOIs.

In [13]:
import base64
import json
import glob

def unpack_records(datacite_json_file):
    """input is the string value of a datacite json file, returns a list of len 2 tuples of xml records
    The tuple[0] is the sanitized DOI for file names and tuple[1] is the string of the XML extracted."""
    with open(datacite_json_file, 'r') as fin:
        data = json.load(fin)
    records = data['data'] # separate the records from the payload metadata
    xmls = []
    for record in records:
        recid = record['id'] # doi lives at the top level, but is also in the XML
        recid = recid.replace('https://doi.org/', '') # just want the DOI
        recid = recid.replace('/','-') # can't have slashes
        recid = recid.replace('.', '_') # don't want dots
        base = record['attributes']['xml'] # extract the XML base64 data out
        xml = base64.b64decode(base) # decode the base64, which produces a byte thingie
        xmls.append((recid, xml)) # craft the pair and add to accumulator
    return xmls

payloads = glob.glob('tuatara/*.json')

for record in payloads: # grab the payload file
    data = unpack_records(record) # unpack all the individual records
    for rid, xml in data: # loop through those records, multiassignment to get the x,y of the pair out
        fname = "tuatara/" + rid + ".xml" # craft the full file path/name
        with open(fname, 'w') as fout: # use that file name to write the XML content out.
            fout.write(xml.decode('utf-8')) # need to cast back to utf-8 because of base64

Working with XPath

Let's break open one of these XML files and extract some things out. XPath is an independent language, much like how regex is, that you can use to create data extraction queries (and other stuff!) on XML data.

  • RegEx is a system to describe patterns in text and extract/manipulate those results
  • SQL is a system to describe locations and relationships in relational databases and extract/manipulate the results
  • XPath is a system to describe locations of things in XML tree structures to extract and manipulate the results.

There are many packages to work with XML data in python, but lxml is one of the nicest/stablist.

XPath is a large language, so we're going to cover a few things.

  • Grabbing text of an element
  • Grabbing an attribute value

XPath essentials-ish

The simplest XPath query is a list of elements, separated by /, to describe an exact location in the tree. For example, in the previous structure, I could access the location of child via:

/root/middle/child

This should look very similar to a URL or a file path. The / is used in a similar way.

However, sometimes there are multiple elements that you want or you don't need to specify the full path to that element. You can use // to have the query search at any level of the tree instead of starting at the root.

//child

This query would look for the child tag at any level in the tree.

Describing stuff in xpath

  • an element name needs no other syntax to be to be a reference for an element, as you can see with our references with child
  • / look only 1 level deep, so only for immediate children of the element proceeding it
  • // look anywhere in the descendants of the element proceeding it
  • . indicate the current node (you'll usually use this inside of functions)
  • .. indicate the parent node of the current element. You can use this to have it look up to a previous element. For example, "find this specific element, but then select the element parent to it"
  • @ this is used before a name to indicate that you are talking about an attribute name instead of an element name. For example, @href for an a element.
  • element[position number]: index starting at 1, allows you to indicate the "nth" instant of that element. Example, a[3] would be the third a found with that query.
  • element[logical check] You can place a variety of functions and other boolean checks inside the []. There are multiple things you can put in here (https://www.w3schools.com/xml/xsl_functions.asp).
  • element[@attribute = 'something'] you can use this to select an element with an attribute that has a specific value. You cas alse reference the current node's element values with ., so //p[. = "thing"] finds all the p elements that have the element text value of exactly "thing". Warning! This will look deeper into the children of that node. If you want to look at the text value of the current element, you should use text() instead of .. So element[text() = "thing"]. You can use text() or . in any of the logical checks that you want.
  • You can use compound boolean checks inside the [], such as //element[@attribute = "something" and contains(., "another")] . Connect these boolean checks with and or or.
  • * is a wildcard used to represent "any element". So, you could say //*[@class = "title"] to find any element that has a class atribute value of "title".

Parsing the XML

So you have an XML file that you want to parse as XML so you can apply an XPath on to it.

The basic pattern

The basic pattern that we will be exploring here is this:

  1. Read in the document
  2. Parse that object (either an IO object or string depending on your pattern) into a tree object.
  3. Apply you desired XPath things to that tree object.

There will be one and only one way you'll need to do this class, but there are other methods out there that you'll see.

Our pattern for class will be:

  1. Read the XML file with .read() to read in the text as a big string.
  2. Pass that string the parsing method .fromstring() to parse into a tree object. (don't forget that you'll have to import this module)
  3. Use the .xpath() function on that tree object to execute xpath queries on it.

Step 0: import the lxml module

from lxml import etree

Step 1: read in the file

The rb read in mode is required because of the encoding issues.

infile =  open('YOURFILENAME.xml', 'rb')
xml = infile.read() # this will be passed to the parser
infile.close()

Step 2: parse into a tree object

I could call this variable name anything that I want, but we usually use tree as a convention to indicate that it is the entire XML tree and not a constituent node. This is using the .fromstring() function from the lxml/etree, which will parse string text into a tree object.

tree = etree.fromstring(xml)

Step 3: use the .xpath() on the tree object to execute an xpath query

We'll be talking about namespaces in a later section.

Example when there in no namespace happening:

results = tree.xpath('//elementwhatever/text()')

Example when there is a namespace schema to handle:

results = tree.xpath('//alias:elementwhatever/text()', namespaces={'alias': "URL found in the document goes here"})

Don't worry, this entire lesson is about unpacking more about step 3.

In [42]:
import glob
from lxml import etree

xmldata = glob.glob('tuatara/*.xml')
grabone = xmldata[15]
print(grabone)

infile =  open(grabone, 'rb') # don't forget that rb in here
xml = infile.read()
infile.close()

tree = etree.fromstring(xml)
tuatara/10_5061-dryad_75nv22qj-2.xml
In [43]:
print(tree)
<Element {http://datacite.org/schema/kernel-3}resource at 0x10562fc08>

So this looks like nonsense but it's pretty informative. This tells is that we have an Element object, and represents our root node.

What's the name of that root node? {http://datacite.org/schema/kernel-3}resource

In the {} we have the namespace that was detected by the parser. Next to it we have resource which is the name of the element itself.

When we see this {} stuff, we can't just say that the element is resource. We need to provide the namespace information to the parser along with the name of the element that we want.

We may have multiple namespaces at play in our XML, so a dictionary is used to provide that information.

{alias: schema url}

We provide the alias, using whatever string that we want. But the schema URL must be whatever shows up in the {} from when you print it out.

Canonically speaking, we usually save this dictionary as a variable to keep our code clean. Now we can use our xpath function to start extracting data.

You can choose to select either a node element in the tree or extract some data out of the tree. Let's extract all the subject tags.

In [44]:
# unsure of the structure?  We can loop over the elements in there.
# When a node has children, you can loop over it to look at the childern.
# the length of the element will tell you how many children you have

for ele in tree:
    print(ele, len(ele))
    for thing in ele:
        print("\t", thing, len(thing))
<Element {http://datacite.org/schema/kernel-3}identifier at 0x105cd9a08> 0
<Element {http://datacite.org/schema/kernel-3}version at 0x1056beec8> 0
<Element {http://datacite.org/schema/kernel-3}creators at 0x105cde1c8> 6
	 <Element {http://datacite.org/schema/kernel-3}creator at 0x1056beec8> 1
	 <Element {http://datacite.org/schema/kernel-3}creator at 0x10562f108> 1
	 <Element {http://datacite.org/schema/kernel-3}creator at 0x105cded08> 1
	 <Element {http://datacite.org/schema/kernel-3}creator at 0x105cd9688> 1
	 <Element {http://datacite.org/schema/kernel-3}creator at 0x10562f108> 1
	 <Element {http://datacite.org/schema/kernel-3}creator at 0x1056beec8> 1
<Element {http://datacite.org/schema/kernel-3}titles at 0x105cd9a08> 1
	 <Element {http://datacite.org/schema/kernel-3}title at 0x105cde1c8> 0
<Element {http://datacite.org/schema/kernel-3}publisher at 0x10562f108> 0
<Element {http://datacite.org/schema/kernel-3}publicationYear at 0x1056beec8> 0
<Element {http://datacite.org/schema/kernel-3}subjects at 0x105cd9a08> 15
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x1056beec8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cd9688> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cde1c8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x1056beec8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cd9688> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cde1c8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x1056beec8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cd9688> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cde1c8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x1056beec8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cd9688> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cde1c8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x1056beec8> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cd9688> 0
	 <Element {http://datacite.org/schema/kernel-3}subject at 0x105cde1c8> 0
<Element {http://datacite.org/schema/kernel-3}dates at 0x10562f108> 1
	 <Element {http://datacite.org/schema/kernel-3}date at 0x105cd9a08> 0
<Element {http://datacite.org/schema/kernel-3}resourceType at 0x105cd9688> 0
<Element {http://datacite.org/schema/kernel-3}relatedIdentifiers at 0x105cde1c8> 1
	 <Element {http://datacite.org/schema/kernel-3}relatedIdentifier at 0x105cd9688> 0
<Element {http://datacite.org/schema/kernel-3}rightsList at 0x10562f108> 1
	 <Element {http://datacite.org/schema/kernel-3}rights at 0x105cde1c8> 0
<Element {http://datacite.org/schema/kernel-3}descriptions at 0x105cd9a08> 1
	 <Element {http://datacite.org/schema/kernel-3}description at 0x10562f108> 0
In [45]:
ns = {'datacite': 'http://datacite.org/schema/kernel-3'} #ns for namespaces

print(tree.xpath('//datacite:subject/text()', namespaces = ns))
['ultraconserved elements', 'phylogenomic', 'phylogenetics', 'reptiles', 'turtles', 'Pantherophis guttata', 'Pelomedusa subrufa', 'Chrysemys picta', 'Alligator mississippiensis', 'Crocodylus porosus', 'Sphenodon tuatara', 'Gallus gallus', 'Taeniopygia guttata', 'Anolis carolinensis', 'Homo sapiens']

Cool! So we're getting all the subjects out. As you can see, the results will always come back at you as a list. Even when there's nothing! So you'll need to get creative about how you extract stuff out and have some good defensive practices.

Using /text() allows us to extract the text values out of an element. Let's look at getting attribute values back.

Take a look at the related identifier element. The text is the URI to the object at question and each element has an attribute value indicating what kind of relationship it is. Let's take a look at one.

<relatedIdentifier relatedIdentifierType="DOI" relationType="IsPartOf">10.5061/DRYAD.75NV22QJ</relatedIdentifier>
  • relatedIdentifier is the element name.
  • 10.5061/DRYAD.75NV22QJ is the element text
  • relatedIdentifierType and relationType are attribute names
  • DOI and IsPartOf are their respective attribute values

Let's first select the node that we want.

In [48]:
print(tree.xpath('//datacite:relatedIdentifier', namespaces=ns))
[<Element {http://datacite.org/schema/kernel-3}relatedIdentifier at 0x105cd9c88>]

Now we've found the element that we want and can begin extracting data from it.

In [49]:
print(tree.xpath('//datacite:relatedIdentifier/text()', namespaces=ns))
['10.5061/DRYAD.75NV22QJ']
In [52]:
print(tree.xpath('//datacite:relatedIdentifier/@relationType', namespaces=ns))
['IsPartOf']
In [53]:
print(tree.xpath('//datacite:relatedIdentifier/@relatedIdentifierType', namespaces=ns))
['DOI']

Working with CSVs

Python also has a nice CSV module to use.

Creating CSV data for writing

CSV data is inherently rectangular. These need to be rows and columns. Rows seem to be the easy trick, becasue we already have horizontal looking data structures, which are lists. But how do you say that something is a column?

Well, you can't really. There are ways to name things in dictionaries, which is another option.

But think less about named stuff and more about position. If you can make lists where the postition value can be inferred to mean the column bins, then you can use lists.

More specifically, a list of lists.

Let's make a little program that gets the DOI, the publisher, and the publication year. These are conveniently 1:1 data points. The advantage of using XML or json is that you can nicely store 1:many data points. But the cells in a CSV need to be a single data point.

There are ways to get around this, and a lot of your stragegy will be dependent on how you'll be using the data later.

In [114]:
import glob
from lxml import etree
import csv

xmlfiles = glob.glob('tuatara/*.xml')

all_rows = [] # my big accumulator list

for xmlf in xmlfiles:
    infile =  open(xmlf, 'rb') # don't forget that rb in here
    xml = infile.read()
    infile.close()
    
    tree = etree.fromstring(xml)
    # I'm leaving this in because it makes me giggle
#     datacitever = str(tree).split('{')[1].split('}')[0] 

    dcmaybe = [v for v in tree.nsmap.values() if 'datacite.org' in v][0]
    ns = {'datacite': dcmaybe}
    doi = tree.xpath('//datacite:identifier/text()', namespaces=ns)[0]
    pub = tree.xpath('//datacite:publisher/text()', namespaces=ns)[0]
    year = tree.xpath('//datacite:publicationYear/text()', namespaces=ns)[0]
    # now that we have all out data points we can assemble them.
    row = [doi, year, pub]
    all_rows.append(row)

# now that we have the data, we can write it out.
headers = ['doi', 'publication_year', 'publisher']

with open('tuatara/doi-pub-year.csv', 'w') as fout:
    csv_out = csv.writer(fout)
    csv_out.writerow(headers) # do one at a time
    csv_out.writerows(all_rows) # do a list of lists

Reading in csv data

You use the csv reader methods to have it nicely parse a csv data file. Pass it an file open for reading.

In [116]:
with open('tuatara/doi-pub-year.csv', 'r') as fin:
    csv_in = csv.reader(fin)
    headers = next(csv_in)
    data = [row for row in csv_in]
In [117]:
print(headers)
['doi', 'publication_year', 'publisher']
In [118]:
print(data)
[['10.13140/RG.2.2.13376.74249', '2016', 'Unpublished'], ['10.17605/OSF.IO/BDS35', '2016', 'Open Science Framework'], ['10.25334/Q4FX12', '2018', 'QUBES'], ['10.5061/DRYAD.568JH', '2017', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/1', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/10', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/11', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/12', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/13', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/14', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/15', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/16', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/17', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/18', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/19', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/2', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/20', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/22', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/3', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/4', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/5', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/6', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/7', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/8', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ/9', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.75NV22QJ', '2012', 'Dryad Digital Repository'], ['10.5061/DRYAD.GR573/1', '2013', 'Dryad Digital Repository'], ['10.5061/DRYAD.GR573/2', '2013', 'Dryad Digital Repository'], ['10.5061/DRYAD.GR573/3', '2013', 'Dryad Digital Repository'], ['10.5061/DRYAD.GR573/4', '2013', 'Dryad Digital Repository'], ['10.5061/DRYAD.GR573/5', '2013', 'Dryad Digital Repository'], ['10.5061/DRYAD.GR573', '2013', 'Dryad Digital Repository'], ['10.5281/zenodo.189620', '2009', 'Zenodo'], ['10.5281/zenodo.211734', '2012', 'Zenodo'], ['10.5281/zenodo.215502', '2012', 'Zenodo'], ['10.6084/M9.FIGSHARE.25505', '2011', 'Figshare'], ['10.6084/M9.FIGSHARE.25505.V1', '2011', 'Figshare'], ['10.6084/m9.figshare.4635133', '2017', 'Figshare'], ['10.6084/m9.figshare.4635133.v1', '2017', 'Figshare'], ['10.6084/m9.figshare.5318950', '2017', 'Figshare'], ['10.6084/m9.figshare.5318950.v1', '2017', 'Figshare']]