资讯动态

用 Python 检查页面正文与 Organization JSON-LD 的名称差异

发布时间:2026/9/11 18:35:55 来源:尧图企业网站定制
多个页面分别维护公司名、品牌名和 JSON-LD 时容易出现正文已更新、结构化数据仍是旧值的情况。下面给出一个针对已保存 HTML 的最小检查方法提取可见文本和 Organization 节点输出待核对项最后由维护者判断是否需要修改。示例只做一致性诊断不衡量搜索排名或 AI 推荐效果。名称没有出现在正文里是一个检查线索不代表字段必然错误。先明确检查对象检查前由内容负责人确认主体名称、对外名称及允许的别名分别记录来源页面和核验日期。不要把公司法定名称、品牌和子公司名称压成同一个字符串。合法的简称也不必在所有页面机械重复。Schema.org 的 Organization 类型提供 name、legalName、alternateName 等属性。name 用于名称legalName 用于法定名称alternateName 用于其他名称是否填写仍取决于真实资料和页面语境。sameAs 也不宜收集所有提到公司的链接它应指向用于标识同一实体的页面。最小检查代码先把需要检查的页面保存到本地 audited_pages 目录。以下代码仅使用 Python 标准库不发送网络请求也不修改页面它处理单个对象、对象数组以及 graph。无效 JSON 单独报错不把解析失败误当成没有差异。import json from html.parser import HTMLParser from pathlib import Path class Page(HTMLParser): def __init__(self): super().__init__() self.text [] self.ld [] self.script None self.hidden 0 def handle_starttag(self, tag, attrs): attrs dict(attrs) if tag script: self.script [] if attrs.get(type, ).lower() application/ldjson else None if tag in {script, style, noscript}: self.hidden 1 def handle_data(self, data): if self.script is not None: self.script.append(data) elif not self.hidden: self.text.append(data) def handle_endtag(self, tag): if tag script: if self.script is not None: self.ld.append(.join(self.script)) self.script None if tag in {script, style, noscript}: self.hidden max(0, self.hidden - 1) def nodes(value): if isinstance(value, list): for item in value: yield from nodes(item) elif isinstance(value, dict): yield value yield from nodes(value.get(graph, [])) def normalize(value): return .join(str(value).split()).casefold() for path in sorted(Path(audited_pages).glob(*.html)): page Page() page.feed(path.read_text(encodingutf-8)) visible normalize( .join(page.text)) found False parse_failed False for raw in page.ld: try: data json.loads(raw) except json.JSONDecodeError as error: parse_failed True print(path.name, JSON解析失败, error.msg) continue for node in nodes(data): types node.get(type, []) types types if isinstance(types, list) else [types] if Organization not in types: continue found True for field in (name, legalName, alternateName): values node.get(field, []) values values if isinstance(values, list) else [values] for value in values: if isinstance(value, str) and normalize(value) and normalize(value) not in visible: print(path.name, field, value, 待核对正文未匹配) if not found: print(path.name, 解析失败结果不完整 if parse_failed else 未检测到Organization节点)如何读结果例如正文只出现一个品牌简称而 legalName 是另一个完整名称脚本会列出法定名称待核对。维护者应检查页面是否已经解释品牌与主体的关系再决定补充可见说明还是修正字段不能直接用简称覆盖法定名称。建议把结果写成差异表页面、字段、正文值、JSON-LD 值、资料来源、处理决定、负责人和复测日期。修正后重新保存 HTML 再跑一次同时用浏览器确认用户能读到的内容。一个报告没有输出差异并不等于其他字段、公司主体或资料来源已验证正确。示例的限制这段脚本检查的是 HTML 文本不能完整判断 CSS 隐藏元素、前端异步渲染或自然语言中的实体关系也没有展开通过 id 引用的其他节点没有把所有 Organization 子类型纳入检查。生产使用时应按站点模板补充规则并保留原始 HTML 和人工判断依据。不要把规范化处理扩大到删除全部标点或替换所有近似名称否则可能把不同企业合并。多语言、旧品牌和集团子公司差异应先核对关系再决定是否作为允许例外。参考资料Schema.org Organization 类型定义https://schema.org/Organization。本文为技术检查示例部分内容由 AI 辅助生成。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价