我有一个问题,我想知道是否值得花时间尝试用Python解决。我有一个大型CSV文件的科学名称的鱼类。我想用一个大型的鱼形态信息数据库(www.fishbase.ca)交叉引用该CSV文件,并让代码返回每条鱼的最大长度。基本上,我需要创建代码,在fishbase网站上搜索每条鱼,然后在页面上找到最大长度信息并将其以CSV文件的形式返回给我。最后两部分相对简单,但第一部分是我被卡住的地方。提前致谢。
答案 0 :(得分:1)
看起来您可以直接从属和种中生成网址,即
虹鳟鱼(oncorhynchus mykiss)成为
http://www.fishbase.ca/summary/Oncorhynchus-mykiss.html
类似
def make_url(genus, species):
return (
"http://www.fishbase.ca/summary/{}-{}.html"
.format(genus.title(), species.lower())
)
查看页面源代码,html严重缺乏语义;虽然使用正则表达式解析html是邪恶而可怕的,但我认为它是这种情况下最简单的方法:
import re
fishlength = re.compile("max length : ([\d.]+) ([cm]{1,2})", re.I).search
def get_length_in_cm(html):
m = fishlength(html)
if m: # match found
value = float(m.group(1))
unit = m.group(2)
if unit == "cm":
return value
elif unit == "m":
return value * 100.
else:
raise ValueError("Unknown unit: {}".format(unit))
else:
raise ValueError("Length not found")
然后抓住每一页,
import csv
import requests
from time import sleep
DELAY = 2
GENUS_COL = 4
SPECIES_COL = 5
with open("fish.csv") as inf:
next(inf) # skip header row
for row in csv.reader(inf):
url = make_url(row[GENUS_COL], row[SPECIES_COL])
# should add error handling, in case
# that page doesn't exist
html = requests.get(url).text
length = get_length_in_cm(html)
# now store the length value somewhere
# be nice, don't pound their site
sleep(DELAY)
答案 1 :(得分:0)
因此,为了在其他Web应用程序中使用这些信息,您需要使用API来获取其数据。
Fishbase.ca(或.org)没有官方面向公众的API。有一些chat in 2013关于创建一个RESTful API,它只是你需要的门票,但这还没有发生(不要屏住呼吸)。
另一种方法是使用您需要查找的鱼的名称,将其放入URI(例如www.fishbase.ca/fish/Rainbow+Trout),然后使用Xquery或类似方法深入研究DOM以查找最大长度。
不幸的是,fishbase没有这种方法所需的URI,this是Rainbow Trout的URI - 使用ID而不是名称来轻松查找。
我建议寻找另一个寻找这两个API的数据提供者。
关于第二种方法:网站所有者可能不会以这种方式告知您使用他们的网站。如果可以,请事先询问他们。