Programmatic access to DrugBank drug and target data; use when you need to download, parse, and analyze DrugBank XML for properties, interactions, pathways, and pharmacology.
68
84%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
drugbank-downloader (requires DrugBank access).lxml for reliable extraction of nested DrugBank entities.pandas DataFrames for filtering, joining, and export.networkx (e.g., DDI graphs, drug–target bipartite graphs).rdkit for structure-based processing (e.g., SMILES/InChI handling when present).drugbank-downloader (version varies by your environment)lxml>=4.9pandas>=2.0networkx>=3.0rdkit>=2022.09 (optional; required only for structure/chemistry workflows)"""
End-to-end example:
1) Parse a local DrugBank XML file
2) Extract a minimal drug table
3) Extract drug-drug interactions
4) Build a DDI graph
Prerequisites:
- You must obtain DrugBank XML via your DrugBank account/license.
- Place the XML file at ./drugbank.xml (or update the path).
"""
from lxml import etree
import pandas as pd
import networkx as nx
DRUGBANK_XML_PATH = "./drugbank.xml"
NS = {"db": "http://www.drugbank.ca"} # DrugBank XML namespace
# --- Parse XML ---
tree = etree.parse(DRUGBANK_XML_PATH)
root = tree.getroot()
# --- Extract drug records (minimal fields) ---
drugs = []
for drug in root.xpath("//db:drug", namespaces=NS):
drugbank_id = drug.xpath("string(db:drugbank-id[@primary='true'])", namespaces=NS).strip()
name = drug.xpath("string(db:name)", namespaces=NS).strip()
drug_type = drug.get("type", "").strip()
# Optional: first SMILES if present
smiles = drug.xpath(
"string(db:calculated-properties/db:property[db:kind='SMILES']/db:value)",
namespaces=NS,
).strip()
drugs.append(
{
"drugbank_id": drugbank_id,
"name": name,
"type": drug_type,
"smiles": smiles or None,
}
)
drugs_df = pd.DataFrame(drugs).dropna(subset=["drugbank_id"])
print("Drugs:", len(drugs_df))
print(drugs_df.head())
# --- Extract drug-drug interactions ---
interactions = []
for drug in root.xpath("//db:drug", namespaces=NS):
src_id = drug.xpath("string(db:drugbank-id[@primary='true'])", namespaces=NS).strip()
src_name = drug.xpath("string(db:name)", namespaces=NS).strip()
for ddi in drug.xpath("db:drug-interactions/db:drug-interaction", namespaces=NS):
tgt_id = ddi.xpath("string(db:drugbank-id)", namespaces=NS).strip()
tgt_name = ddi.xpath("string(db:name)", namespaces=NS).strip()
description = ddi.xpath("string(db:description)", namespaces=NS).strip()
if src_id and tgt_id:
interactions.append(
{
"source_id": src_id,
"source_name": src_name,
"target_id": tgt_id,
"target_name": tgt_name,
"description": description or None,
}
)
ddi_df = pd.DataFrame(interactions)
print("Interactions:", len(ddi_df))
print(ddi_df.head())
# --- Build a DDI graph ---
G = nx.from_pandas_edgelist(
ddi_df,
source="source_id",
target="target_id",
edge_attr=["description"],
create_using=nx.Graph(),
)
print("DDI graph nodes:", G.number_of_nodes())
print("DDI graph edges:", G.number_of_edges())
# Example analysis: top 10 drugs by interaction degree
top_degree = sorted(G.degree, key=lambda x: x[1], reverse=True)[:10]
top_degree_df = pd.DataFrame(top_degree, columns=["drugbank_id", "degree"]).merge(
drugs_df[["drugbank_id", "name"]],
on="drugbank_id",
how="left",
)
print(top_degree_df)Access & authentication
drugbank-downloader step is responsible for fetching the release artifacts; ensure you comply with DrugBank terms.XML parsing approach
lxml.etree is used for robust XPath-based extraction.http://www.drugbank.ca); XPath queries must include the namespace mapping (e.g., NS = {"db": "http://www.drugbank.ca"}).Core extraction patterns
db:drugbank-id[@primary='true']db:namedb:calculated-properties/db:property[db:kind='SMILES']/db:valuedb:drug-interactions/db:drug-interaction with fields db:drugbank-id, db:name, db:descriptionData modeling
pandas DataFrames for normalized tables (drugs, targets, interactions, pathways).networkx for graph representations:
description as edge attribute).Performance considerations
etree.iterparse) and writing intermediate results to disk.Further references
references/data-access.mdreferences/drug-queries.mdreferences/interactions.md63c61d3
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.