语义网新手求助:提取含ACT的地址ID及RDF存储入库方案
Hey there! Since you've already fetched the page content, let's tackle the rest of your workflow step by step. I'll walk you through extracting those ACT-specific address IDs, converting the data to RDF, and storing it in a database for later use.
1. 提取包含'ACT'的地址ID
首先我们要解析HTML,找出包含'ACT'的地址条目(GNAF是澳大利亚地址数据,ACT指首都领地)。假设页面里的地址都指向详情页链接,我们可以这样提取并筛选ID:
import requests from bs4 import BeautifulSoup import re url='http://gnafld.net/address/?page=7&per_page=10' page = requests.get(url) soup = BeautifulSoup(page.text, 'html.parser') # 找到所有指向地址详情页的链接(根据实际页面结构调整正则) address_links = soup.find_all('a', href=re.compile(r'/address/\d+')) act_address_ids = [] for link in address_links: # 从链接中提取地址ID(比如/address/12345 → 12345) address_id = link['href'].split('/')[-1] # 检查地址文本是否包含ACT(如果页面用其他元素展示地址,调整获取文本的方式) address_content = link.get_text(strip=True) if 'ACT' in address_content: act_address_ids.append(address_id) print("找到的ACT地址ID:", act_address_ids)
提示:如果页面用特定类名(比如address-item)包裹地址条目,修改find_all的目标元素即可。可以先查看页面HTML结构确认选择器。
2. 获取地址详情并转换为RDF
接下来我们要拉取每个ACT地址的完整信息,再构造成RDF结构。我们用rdflib库来构建RDF图,先通过pip install rdflib安装它。
from rdflib import Graph, URIRef, Literal, Namespace # 定义自定义命名空间(也可以用Schema.org这类现成的本体) GNAF_ONTO = Namespace("http://gnafld.net/ontology/") ADDRESS_URI = Namespace("http://gnafld.net/address/") # 初始化空的RDF图 rdf_graph = Graph() # 遍历每个ACT地址ID,获取详情 for addr_id in act_address_ids: detail_url = f"http://gnafld.net/address/{addr_id}" detail_page = requests.get(detail_url) detail_soup = BeautifulSoup(detail_page.text, 'html.parser') # 提取地址字段(根据详情页实际HTML结构调整选择器) address_line = detail_soup.find('div', class_='address-line').get_text(strip=True) suburb = detail_soup.find('div', class_='suburb').get_text(strip=True) postcode = detail_soup.find('div', class_='postcode').get_text(strip=True) # 为地址创建唯一URI addr_resource = URIRef(ADDRESS_URI + addr_id) # 向RDF图添加三元组 rdf_graph.add((addr_resource, GNAF_ONTO.hasAddressLine, Literal(address_line))) rdf_graph.add((addr_resource, GNAF_ONTO.hasSuburb, Literal(suburb))) rdf_graph.add((addr_resource, GNAF_ONTO.hasPostcode, Literal(postcode))) rdf_graph.add((addr_resource, GNAF_ONTO.isLocatedInState, Literal('ACT'))) # 可选:以Turtle格式打印RDF内容验证 print(rdf_graph.serialize(format='turtle').decode('utf-8'))
提示:如果详情页用<p>或其他标签展示字段,修改find的目标元素即可。如果页面有经纬度等更多信息,也可以扩展三元组的内容。
3. 将RDF存入数据库
为了后续使用,我们用rdflib-sqlalchemy把RDF图存入数据库,这里以SQLite为例,先通过pip install rdflib-sqlalchemy安装依赖。
from rdflib_sqlalchemy import registerplugins # 注册SQLAlchemy存储插件 registerplugins() # 连接SQLite数据库(不存在则自动创建) db_connection_uri = 'sqlite:///gnaf_act_addresses.db' db_graph = Graph(store='SQLAlchemy', identifier='http://gnafld.net/') db_graph.open(db_connection_uri, create=True) # 将RDF图写入数据库 db_graph += rdf_graph # 关闭连接保存更改 db_graph.close() print("RDF数据已成功存入数据库!")
如果用PostgreSQL或MySQL,修改db_connection_uri为对应格式即可(比如postgresql://user:password@localhost/gnaf_db)。
内容的提问来源于stack exchange,提问作者SpongeBob

