我们的目标是爬取化工产品,然后转换为RDF数据,之后使用jena进行查询。
爬取化工产品的信息
我们的目标网站是MERCK。这个网站有一些的化工产品。使用的python包是BeautifulSoup。
首先读取存放URL的json文件
jsonFile = open("url.json",'r' , encoding='utf-8')
urls = json.load( jsonFile)
items = urls.items()
#遍历json文件
for key , value in items:
fatherClass = key
url = value
json文件内容如下,URL和对应的分类
{
"分析色谱":"https://www.sigmaaldrich.cn/CN/zh/products/analytical-chemistry/analytical-chromatography",
"分析试剂":"https://www.sigmaaldrich.cn/CN/zh/products/analytical-chemistry/analytical-reagents",
"分析样品制备":"https://www.sigmaaldrich.cn/CN/zh/products/analytical-chemistry/analytical-sample-preparation",
"光度法及快速化学品检测":"https://www.sigmaaldrich.cn/CN/zh/products/analytical-chemistry/photometry-and-rapid-chemical-testing
}
之后访问URL,获取页面文件,使用的是get请求。
response = requests.get(url)
response.encoding = response.apparent_encoding #设置编码格式
print("状态码:"+ str( response.status_code ) ) #打印状态码
# print(response.text)#输出爬取的信息
之后使用BeautifulSoup解析HTML文件,通过find_all方法找到对应的tag
soup = BeautifulSoup(response.text, "lxml")
div = soup.find_all('div' , attrs={'class':"MuiTypography-root MuiTypography-body1"})
在找到对应的tag后,遍历children获取其中的内容。去除空格是因为转换为NT文件后上传到jena Fuseki不能有空格。
for d in div:
childrens = d.contents
name = childrens[0].text
description = childrens[1].text
name = name.replace(" ", "")
description = description.replace(" ", "")
之后就是将数据转换为RDF的格式
subClassStr = "<http://%s> <http://%s> <http://%s>."
descriptionStr = "<http://%s> <http://%s> <http://%s>."
instanceStr ="<http://%s> <http://%s> <http://%s>."
subClassStr = subClassStr %(name , "subclass", fatherClass)
descriptionStr = descriptionStr%( name , "description",description )
print("名字:", name , "————————描述:", description)
triples.append(subClassStr)
triples.append(descriptionStr)
for i in range(10):
tempStr = instanceStr %(name , "instance" , name + str(i))
triples.append(tempStr)
之后存储文件
filename = ("%s_triples.nt") % (fatherClass)
with open(filename,"w+", encoding='utf-8') as fd:
fd.write("\n".join(triples))
print("write %s success!"% fatherClass)
使用jena Fuseki
在Windows下点击fuseki-server.bat
之后在浏览器输入http://localhost:3030/即可使用。
web页面
查询语言是SPARQL。
查询
查询的语法是三元组的形式。
查询第三条是分析色谱的三元组的数目
PREFIX m: <http://>
SELECT (COUNT (?subject) AS ?num )
WHERE {
?subject ?re m:分析色谱 .
}
结果
结果
查询第三条是分析色谱的三元组的前两个属性的信息
SELECT ?subject ?re
WHERE {
?subject ?re m:分析色谱 .
}
结果
结果
网友评论