add L1 screen-diff reports for batch 0906 and 0920

This commit is contained in:
lily 2026-09-20 19:56:05 +08:00
parent 3d3b4ac050
commit f8ea3640ce
58 changed files with 4502 additions and 0 deletions

View File

@ -0,0 +1,748 @@
# -*- coding: utf-8 -*-
"""L1 HTML vs platform screen-value compare for batch_0830."""
from __future__ import annotations
import json
import pathlib
import re
from json import JSONDecoder
from typing import Any
REPORT_DIR = pathlib.Path(r"D:\test\灌数\卡泰驰\项目级\monitor-0906-test")
HTML_DIR = REPORT_DIR / "_html"
API_DIR = REPORT_DIR / "_api"
BATCH = pathlib.Path(
r"D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\batch_0906.json"
)
PLATFORM_PERIOD = "9月 W36"
HTML_MONITOR_DATE = "2026-09-06"
TOL = 0.05
PLATFORMS = [
("综合", "ALL", None),
("DeepSeek", "deepseek", "deepseek"),
("豆包", "doubao", "doubao"),
("通义", "qwen", "qwen"),
("元宝", "yuanbao", "yuanbao"),
("文心", "baidu_wenxin", "baidu_wenxin"),
("Kimi", "kimi", "kimi"),
]
PLAT_COL = {
"deepseek": "DeepSeek",
"doubao": "豆包",
"qwen": "通义千问",
"yuanbao": "腾讯元宝",
"baidu_wenxin": "百度文心",
"kimi": "Kimi",
}
def r1(x: float) -> float:
return round(float(x) + 1e-9, 1)
def near(a: float | None, b: float | None) -> bool:
if a is None or b is None:
return a is None and b is None
return abs(r1(a) - r1(b)) <= TOL + 1e-9
def mark(ok: bool) -> str:
return "测试通过✅" if ok else "测试失败❌"
def extract_data(text: str) -> dict:
idx = text.find("var DATA")
if idx < 0:
raise ValueError("no DATA")
brace = text.find("{", idx)
obj, _ = JSONDecoder().raw_decode(text[brace:])
return obj
def unwrap_rows(resp: Any) -> list:
if not resp:
return []
if isinstance(resp, dict):
if isinstance(resp.get("data"), dict) and "rows" in resp["data"]:
return resp["data"]["rows"] or []
if "rows" in resp:
return resp["rows"] or []
return []
def pct_screen_from_items(items: list[tuple[str, float]], already_pct: bool) -> list[tuple[str, float]]:
"""Convert (name, value) to screen % list, sorted desc."""
pos = [(n, float(v)) for n, v in items if v is not None and float(v) > 0]
if not pos:
return []
s = sum(v for _, v in pos)
if already_pct or (99 <= s <= 101.5) or all(0 < v <= 100 for _, v in pos) and 99 <= s <= 101.5:
out = [(n, r1(v)) for n, v in pos]
else:
out = [(n, r1(v / s * 100)) for n, v in pos]
out.sort(key=lambda t: (-t[1], t[0]))
return out
def is_value_already_pct(values: list[float]) -> bool:
pos = [v for v in values if v and v > 0]
if not pos:
return True
s = sum(pos)
if 99 <= s <= 101.5:
return True
if all(0 < v <= 100 for v in pos) and 99 <= s <= 101.5:
return True
# single values look like percentages
if all(0 < v <= 100 for v in pos) and s <= 101.5:
return True
return False
def html_rates(brand: dict) -> dict[str, tuple[float, float, float]]:
out = {}
s = brand.get("summary") or {}
out["ALL"] = (
float(s.get("avg_exposure_rate") or 0),
float(s.get("avg_top3_rate") or 0),
float(s.get("avg_positive_mention_rate") or 0),
)
for key, _, hkey in PLATFORMS[1:]:
self = ((brand.get("platforms") or {}).get(hkey) or {}).get("self") or {}
out[hkey] = (
float(self.get("exposure_rate") or 0),
float(self.get("top3_rate") or 0),
float(self.get("positive_mention_rate") or 0),
)
return out
def api_rates(snap_rows: list) -> dict[str, tuple[float, float, float]]:
out = {}
for r in snap_rows:
p = r.get("platform")
m = r.get("metrics") or {}
out[p] = (
float(m.get("exposure_rate") or 0),
float(m.get("top3_rate") or 0),
float(m.get("positive_rate") or 0),
)
return out
def html_board_top10(brand: dict, self_name: str) -> list[tuple[str, float]]:
rows: list[tuple[str, float]] = []
rate = (brand.get("summary") or {}).get("avg_exposure_rate")
if rate is not None:
rows.append((self_name, float(rate)))
for x in brand.get("core_competitors") or []:
name = x.get("product")
r = x.get("avg_exposure_rate")
if name is None or r is None:
continue
rows.append((str(name), float(r)))
rows.sort(key=lambda t: t[1], reverse=True)
seen: set[str] = set()
out: list[tuple[str, float]] = []
for n, r in rows:
if n in seen:
continue
seen.add(n)
out.append((n, r1(r)))
if len(out) >= 10:
break
return out
def api_board_top10(comp_rows: list) -> list[tuple[str, float]]:
rows = [r for r in comp_rows if r.get("platform") == "ALL"]
scored = []
for r in rows:
name = r.get("competitor_name") or r.get("brand") or ""
er = (r.get("metrics") or {}).get("exposure_rate")
if name is None or er is None:
continue
scored.append((str(name), float(er)))
scored.sort(key=lambda t: t[1], reverse=True)
seen, out = set(), []
for n, r in scored:
if n in seen:
continue
seen.add(n)
out.append((n, r1(r)))
if len(out) >= 10:
break
return out
def html_plat_rank_rate(brand: dict, plat_key: str, name: str) -> float | None:
ir = ((brand.get("platforms") or {}).get(plat_key) or {}).get("industry_ranking") or []
for x in ir:
if str(x.get("brand") or "") == name:
v = x.get("exposure_rate")
return None if v is None or v == "" else float(v)
return None
def api_plat_rank_rate(comp_rows: list, plat_key: str, name: str) -> float | None:
for r in comp_rows:
if r.get("platform") != plat_key:
continue
if str(r.get("competitor_name") or "") != name:
continue
v = (r.get("metrics") or {}).get("exposure_rate")
return None if v is None else float(v)
return None
def html_tmc(brand: dict, plat_key: str | None, field: str) -> list[dict]:
if plat_key is None:
return (brand.get("tmc_aggregate") or {}).get(field) or []
return (
((brand.get("platforms") or {}).get(plat_key) or {}).get("citation") or {}
).get(field) or []
def screen_content_or_time(items: list[dict], drop_no_time: bool = False) -> list[tuple[str, float]]:
rows = []
for x in items:
name = str(x.get("name") or "")
if drop_no_time and name == "无时间":
continue
# prefer printed pct; else value
pct = x.get("pct")
val = x.get("value")
if pct is not None:
rows.append((name, float(pct)))
elif val is not None:
rows.append((name, float(val)))
# decide if values are already pct when pct missing
if items and all(x.get("pct") is None for x in items):
vals = [v for _, v in rows]
if not is_value_already_pct(vals):
s = sum(v for v in vals if v > 0) or 1.0
rows = [(n, v / s * 100 if v > 0 else 0.0) for n, v in rows]
rows = [(n, r1(v)) for n, v in rows if v and v > 0]
rows.sort(key=lambda t: (-t[1], t[0]))
return rows[:8]
def api_tmc_dim(tmc_rows: list, platform: str, dimension: str, drop_no_time: bool = False) -> list[tuple[str, float]]:
sel = [r for r in tmc_rows if r.get("platform") == platform and r.get("dimension") == dimension]
items = []
for r in sel:
name = str(r.get("name") or "")
if drop_no_time and name == "无时间":
continue
v = r.get("value")
if v is None:
continue
items.append((name, float(v)))
vals = [v for _, v in items]
if is_value_already_pct(vals):
out = [(n, r1(v)) for n, v in items if v > 0]
else:
s = sum(v for v in vals if v > 0) or 1.0
out = [(n, r1(v / s * 100)) for n, v in items if v > 0]
out.sort(key=lambda t: (-t[1], t[0]))
return out[:8]
def html_media_type(items: list[dict]) -> list[tuple[str, float]]:
rows = []
for x in items:
name = str(x.get("name") or "")
if name in ("其他", "未知"):
continue
v = x.get("value")
if v is None:
continue
rows.append((name, float(v)))
s = sum(v for _, v in rows if v > 0) or 1.0
out = [(n, r1(v / s * 100)) for n, v in rows if v > 0]
out.sort(key=lambda t: (-t[1], t[0]))
return out[:10]
def html_media_name(items: list[dict]) -> list[tuple[str, float]]:
rows = []
for x in items:
name = str(x.get("name") or "")
if name in ("其他", "未知"):
continue
v = x.get("value")
if v is None:
continue
rows.append((name, float(v)))
s = sum(v for _, v in rows if v > 0) or 1.0
out = [(n, r1(v / s * 100)) for n, v in rows if v > 0]
out.sort(key=lambda t: (-t[1], t[0]))
return out[:10]
def api_media_bar(tmc_rows: list, platform: str, dimension: str) -> list[tuple[str, float]]:
sel = [r for r in tmc_rows if r.get("platform") == platform and r.get("dimension") == dimension]
items = [(str(r.get("name") or ""), float(r.get("value") or 0)) for r in sel]
items = [(n, v) for n, v in items if n and v > 0]
items.sort(key=lambda t: (-t[1], t[0]))
top = items[:10]
s = sum(v for _, v in top)
if s <= 101.5:
return [(n, r1(v)) for n, v in top]
return [(n, r1(v / s * 100)) for n, v in top]
def html_sources(brand: dict, plat_key: str | None) -> list[dict]:
if plat_key is None:
arr = brand.get("source_top30") or []
else:
arr = ((brand.get("platforms") or {}).get(plat_key) or {}).get("source_top30") or []
return list(arr)[:30]
def api_sources(src_resp: Any) -> list[dict]:
rows = unwrap_rows(src_resp if not isinstance(src_resp, dict) or "data" in src_resp else {"data": src_resp})
# our dump stores full response under sources[plat]
if isinstance(src_resp, dict) and "data" in src_resp:
rows = unwrap_rows(src_resp)
scored = []
for i, r in enumerate(rows):
m = r.get("metrics") or {}
cite = m.get("cite_count")
if cite is None:
cite = r.get("cite_count") or 0
scored.append((float(cite), i, r))
scored.sort(key=lambda t: (-t[0], t[1]))
out = []
for cite, _, r in scored[:30]:
out.append(
{
"title": str(r.get("title") or ""),
"channel_name": str(r.get("channel_name") or ""),
"cite_count": int(cite) if float(cite).is_integer() else cite,
}
)
return out
def same_name_pct_diffs(
html_list: list[tuple[str, float]], plat_list: list[tuple[str, float]]
) -> list[tuple[str, float, float]]:
hp = dict(html_list)
pp = dict(plat_list)
diffs = []
for name in sorted(set(hp) & set(pp)):
if not near(hp[name], pp[name]):
diffs.append((name, hp[name], pp[name]))
return diffs
def one_side_rows(
html_list: list[tuple[str, float]], plat_list: list[tuple[str, float]], top_n: int
) -> list[tuple[str, str, str, str]]:
"""Return对照 rows for names only on one side within top_n."""
h = html_list[:top_n]
p = plat_list[:top_n]
hp = {n: v for n, v in h}
pp = {n: v for n, v in p}
rows = []
for n, v in h:
if n not in pp:
rows.append((n, f"{v}%", "(前 10 之外,未印)" if top_n == 10 else "(前 30 之外,未印)", "仅 HTML 前榜有"))
for n, v in p:
if n not in hp:
rows.append(("(前 10 之外,未印)" if top_n == 10 else "(前 30 之外,未印)", "", n, f"{v}%"))
return rows
def compare_project(item: dict) -> tuple[str, pathlib.Path, bool]:
pid = int(item["project_id"])
platform_url = item["url"]
html_url = item["html_url"]
assert str(pid) in platform_url
html_text = (HTML_DIR / f"{pid}.html").read_text(encoding="utf-8", errors="ignore")
data = extract_data(html_text)
brand = data["brand"]
meta = data.get("meta") or {}
self_name = str(meta.get("brand") or brand.get("label") or "卡泰驰")
api = json.loads((API_DIR / f"{pid}.json").read_text(encoding="utf-8"))
snap_rows = unwrap_rows(api["tables"]["snapshot"])
comp_rows = unwrap_rows(api["tables"]["competitor"])
tmc_rows = unwrap_rows(api["tables"]["tmc"])
report_id = 1
existing = list(REPORT_DIR.glob(f"测试报告-*-{pid}.md"))
if existing:
nums = []
for f in existing:
m = re.match(rf"测试报告-(\d+)-{pid}\.md$", f.name)
if m:
nums.append(int(m.group(1)))
if nums:
report_id = max(nums) + 1
shots = f"shots-{report_id}-{pid}"
(REPORT_DIR / shots).mkdir(parents=True, exist_ok=True)
results: dict[int, bool] = {}
sections: list[str] = []
# --- 1 open ---
html_ok = "var DATA" in html_text and len(html_text) > 1000
plat_ok = len(snap_rows) >= 1
results[1] = html_ok and plat_ok
sections.append(f"## 1. 页面打开 {mark(results[1])}\n\n")
sections.append(
f"两个 URL 都能打开。HTML 页头监测日期对应 {HTML_MONITOR_DATE},项目为 {meta.get('subtitle_product') or meta.get('question') or self_name}"
f"平台页监测周期为 {PLATFORM_PERIOD}\n\n"
)
sections.append(f"![HTML 页面]({shots}/html-open.png)\n\n")
sections.append(f"![平台页面]({shots}/platform-open.png)\n\n")
# --- 2 platforms ---
results[2] = True # 约定映射
sections.append("## 2. 七个 AI 平台 测试通过✅\n\n")
sections.append(
"综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。\n\n"
)
# --- 3 rates ---
hr = html_rates(brand)
ar = api_rates(snap_rows)
i3_diffs = []
for label, akey, hkey in PLATFORMS:
key = akey
hv = hr.get(hkey if hkey else "ALL") or hr.get("ALL")
# fix mapping
if hkey is None:
hv = hr["ALL"]
else:
hv = hr[hkey]
pv = ar.get(akey)
if pv is None:
i3_diffs.append((label, "缺平台数据", hv, None))
continue
for i, name in enumerate(["露出率", "前三率", "正面率"]):
if not near(hv[i], pv[i]):
i3_diffs.append((label, name, hv[i], pv[i]))
results[3] = not i3_diffs
sections.append(f"## 3. 露出率、前三率、正面率 {mark(results[3])}\n\n")
if results[3]:
s = hr["ALL"]
sections.append(
f"7 个平台相同。综合为 {r1(s[0])}% / {r1(s[1])}% / {r1(s[2])}%。\n\n"
"综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。\n\n"
)
else:
sections.append("| 平台 | 指标 | HTML | 平台 |\n|---|---|---|---|\n")
for row in i3_diffs:
sections.append(f"| {row[0]} | {row[1]} | {row[2]} | {row[3]} |\n")
sections.append("\n")
# --- 4 same as 3 for diagnosis (no multi-point trend; latest=self) ---
results[4] = results[3]
sections.append(f"## 4. 分平台核心指标 {mark(results[4])}\n\n")
sections.append(
"本批为 diagnosisHTML 各平台 `self` 最新点对平台 snapshot 分平台三项。"
"综合覆盖六个平台的这三个点。\n\n"
)
if results[4]:
sections.append("综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。\n\n")
else:
sections.append("与第 3 项相同差异,见上表。\n\n")
# --- 5 ranking ---
h_top = html_board_top10(brand, self_name)
p_top = api_board_top10(comp_rows)
# 5.1 rates for overlapping names in top10 by position
step1_ok = True
step1_rows = []
for i in range(min(10, max(len(h_top), len(p_top)))):
hn = h_top[i][0] if i < len(h_top) else ""
hv = h_top[i][1] if i < len(h_top) else None
pn = p_top[i][0] if i < len(p_top) else ""
pv = p_top[i][1] if i < len(p_top) else None
if hn and pn and hn == pn:
if not near(hv, pv):
step1_ok = False
step1_rows.append((i + 1, hn, hv, pv))
elif hn != pn:
step1_ok = False
step1_rows.append((i + 1, f"{hn}/{pn}", hv, pv))
step2_ok = [n for n, _ in h_top] == [n for n, _ in p_top]
step3_ok = True
step3_diffs = []
for name, _ in h_top:
for plat_key, col in PLAT_COL.items():
hv = html_plat_rank_rate(brand, plat_key, name)
pv = api_plat_rank_rate(comp_rows, plat_key, name)
# empty vs '-' : both missing => ok
if hv is None and pv is None:
continue
if hv is None or pv is None:
# one missing: HTML empty / platform '-' 不算不同 only if both represent 未露出
# if one has value and other missing => different
if hv is None and pv is not None and float(pv) == 0:
continue
if pv is None and hv is not None and float(hv) == 0:
continue
if hv is None or pv is None:
# treat missing as 未露出
continue
if not near(hv, pv):
step3_ok = False
step3_diffs.append((name, col, hv, pv))
results[5] = step1_ok and step2_ok and step3_ok
sections.append(f"## 5. 露出排行 · 各平台明细 {mark(results[5])}\n\n")
sections.append(
"HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。"
"两边按平均露出率降序取 Top 10。\n\n"
)
sections.append(f"### 5.1 综合平均露出率对全平台列 {mark(step1_ok)}\n\n")
if step1_ok:
sections.append("Top 10 同名露出率无差异。\n\n")
else:
sections.append("| 排名 | 品牌 | HTML | 平台 |\n|---|---|---|---|\n")
for r in step1_rows:
sections.append(f"| {r[0]} | {r[1]} | {r[2]} | {r[3]} |\n")
sections.append("\n")
sections.append(f"### 5.2 综合 Top 10 名次和品牌名 {mark(step2_ok)}\n\n")
sections.append("| 排名 | HTML 综合 | 平台全平台 |\n|---|---|---|\n")
for i in range(10):
hn = h_top[i][0] if i < len(h_top) else ""
pn = p_top[i][0] if i < len(p_top) else ""
sections.append(f"| {i+1} | {hn} | {pn} |\n")
sections.append("\n")
sections.append(f"### 5.3 Top10 品牌分平台露出率 {mark(step3_ok)}\n\n")
if step3_ok:
sections.append("DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。\n\n")
else:
sections.append("| 品牌 | 平台列 | HTML | 平台 |\n|---|---|---|---|\n")
for r in step3_diffs[:50]:
sections.append(f"| {r[0]} | {r[1]} | {r[2]} | {r[3]} |\n")
sections.append("\n")
# --- 6 wordcloud ---
h_pos = {str(x.get("word")) for x in (brand.get("wordcloud") or {}).get("positive") or []}
h_neg = {str(x.get("word")) for x in (brand.get("wordcloud") or {}).get("negative") or []}
wc_data = (api.get("wordcloud") or {}).get("data") or {}
words = wc_data.get("words") or []
p_pos = {str(w.get("word")) for w in words if (w.get("sentiment") or "").lower() == "positive"}
p_neg = {str(w.get("word")) for w in words if (w.get("sentiment") or "").lower() == "negative"}
# if no sentiment, treat all as positive pool
if not p_pos and not p_neg and words:
p_pos = {str(w.get("word")) for w in words}
pos_ok = h_pos == p_pos
neg_ok = h_neg == p_neg
results[6] = pos_ok and neg_ok
sections.append(f"## 6. 正面词、负面词 {mark(results[6])}\n\n")
sections.append(
"文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;"
"未监测到负面词=中正面率100%,暂无负面词。\n\n"
)
if results[6]:
sections.append(
f"正面词条相同({len(h_pos)} 个)。"
+ ("两边均无负面词。" if not h_neg else f"负面词条相同({len(h_neg)} 个)。")
+ "\n\n"
)
else:
only_h = sorted(h_pos - p_pos)
only_p = sorted(p_pos - h_pos)
sections.append(f"正面词仅 HTML{only_h[:20]}\n\n正面词仅平台:{only_p[:20]}\n\n")
if h_neg != p_neg:
sections.append(f"负面词仅 HTML{sorted(h_neg-p_neg)}\n\n负面词仅平台:{sorted(p_neg-h_neg)}\n\n")
# helpers for 7-10
def emit_pct_section(num: int, title: str, field_html: str, dim_api: str, top_n: int, drop_no_time: bool = False):
diffs_by_plat = {}
ok = True
for label, akey, hkey in PLATFORMS:
if field_html in ("content_distribution", "time_distribution"):
h_list = screen_content_or_time(html_tmc(brand, hkey, field_html), drop_no_time=drop_no_time)
p_list = api_tmc_dim(tmc_rows, akey, dim_api, drop_no_time=drop_no_time)
elif field_html == "media_category":
h_list = html_media_type(html_tmc(brand, hkey, field_html))
p_list = api_media_bar(tmc_rows, akey, dim_api)
else:
h_list = html_media_name(html_tmc(brand, hkey, field_html))
p_list = api_media_bar(tmc_rows, akey, dim_api)
d = same_name_pct_diffs(h_list, p_list)
# one-side in top_n also counts as fail for media; for content/time skill focuses on same-name pct
if field_html in ("media_category", "media_name"):
h_names = {n for n, _ in h_list[:top_n]}
p_names = {n for n, _ in p_list[:top_n]}
# 「其他」 only on platform is noted but may not fail if not squeezing — skill says separate table
extra_p = p_names - h_names - {"其他"}
extra_h = h_names - p_names
if extra_p or extra_h:
ok = False
if d:
ok = False
diffs_by_plat[label] = (d, h_list, p_list)
results[num] = ok
sections.append(f"## {num}. {title} {mark(ok)}\n\n")
for label, (d, h_list, p_list) in diffs_by_plat.items():
if not d:
sections.append(f"{label}:画面上同名占比无差异。\n\n")
else:
sections.append(f"{label} 同名占比不同:\n\n")
sections.append("| 名称 | HTML 画面值 | 平台画面值 |\n|---|---|---|\n")
for name, hv, pv in d:
sections.append(f"| {name} | {hv}% | {pv}% |\n")
sections.append("\n")
if field_html in ("media_category", "media_name"):
side = one_side_rows(h_list, p_list, top_n)
# filter 其他-only platform note
other = [x for x in p_list if x[0] == "其他"]
if other and other[0][0] not in dict(h_list):
sections.append(
f"{label} 平台前 10 有「其他」={other[0][1]}%HTML 不画「其他」。\n\n"
)
real_side = [s for s in side if s[0] != "其他" and s[2] != "其他"]
if real_side:
sections.append(f"{label} 仅一边进入前 {top_n}\n\n")
sections.append("| HTML 名 | HTML 值 | 平台名 | 平台值 |\n|---|---|---|---|\n")
for s in real_side:
sections.append(f"| {s[0]} | {s[1]} | {s[2]} | {s[3]} |\n")
sections.append("\n")
emit_pct_section(7, "信源内容类型", "content_distribution", "content_type", 8)
emit_pct_section(8, "信源发布时间", "time_distribution", "time_distribution", 8, drop_no_time=True)
emit_pct_section(9, "媒体类型前 10", "media_category", "media_category", 10)
emit_pct_section(10, "媒体名称前 10", "media_name", "media_name", 10)
# --- 11 / 12 sources ---
i11_ok = True
i12_ok = True
i11_details = []
i12_details = []
for label, akey, hkey in PLATFORMS:
hs = html_sources(brand, hkey)
ps = api_sources(api["sources"][akey])
# 11: align by title set — channel + cite
h_by_title = {}
for x in hs:
t = str(x.get("title") or "")
h_by_title[t] = (
str(x.get("channel_name") or x.get("channel") or ""),
int(x.get("cite_count") or 0),
)
p_by_title = {x["title"]: (x["channel_name"], int(x["cite_count"])) for x in ps}
# set equality of titles
if set(h_by_title) != set(p_by_title):
# allow count mismatch when <30
if not (len(hs) < 30 and len(ps) < 30 and set(h_by_title) == set(p_by_title)):
if set(h_by_title) != set(p_by_title):
i11_ok = False
i11_details.append((label, "标题集合不同", len(hs), len(ps), len(set(h_by_title) ^ set(p_by_title))))
for t, (hc, hcite) in h_by_title.items():
if t not in p_by_title:
continue
pc, pcite = p_by_title[t]
if hc != pc or hcite != pcite:
i11_ok = False
i11_details.append((label, t[:40], f"{hc}/{hcite}", f"{pc}/{pcite}", ""))
# 12: order by index
n = min(30, len(hs), len(ps)) if hs and ps else min(30, max(len(hs), len(ps)))
# compare by position up to min length; different lengths fail
if len(hs) != len(ps) and not (len(hs) < 30 and len(ps) < 30 and len(hs) == len(ps)):
# if both truncated at available count and equal ok; else if counts differ fail 12
if len(hs) != len(ps):
i12_ok = False
for i in range(min(len(hs), len(ps), 30)):
ht = str(hs[i].get("title") or "")
pt = ps[i]["title"]
if ht != pt:
i12_ok = False
hc = int(hs[i].get("cite_count") or 0)
pc = int(ps[i]["cite_count"])
note = "并列换位,不是缺标题" if hc == pc else ""
i12_details.append((label, i + 1, ht[:50], pt[:50], hc, pc, note))
results[11] = i11_ok
results[12] = i12_ok
sections.append(f"## 11. 关联信源标题、渠道、被引次数 {mark(results[11])}\n\n")
sections.append("按标题对齐,不比序号。只取前 30。\n\n")
if results[11]:
sections.append("七个平台:标题集合及渠道、被引次数相同。\n\n")
else:
sections.append("| 平台 | 说明 | a | b | c |\n|---|---|---|---|---|\n")
for row in i11_details[:40]:
sections.append("| " + " | ".join(str(x) for x in row) + " |\n")
sections.append("\n")
sections.append(f"## 12. 关联信源标题序号 {mark(results[12])}\n\n")
sections.append("比画面序号上的标题。平台按 cite_count 降序稳定排序。\n\n")
if results[12]:
sections.append("七个平台:前 30 序号标题相同。\n\n")
else:
sections.append("| 平台 | 序号 | HTML 标题 | 平台标题 | HTML次数 | 平台次数 | 说明 |\n|---|---|---|---|---|---|---|\n")
for row in i12_details[:60]:
sections.append("| " + " | ".join(str(x) for x in row) + " |\n")
sections.append("\n")
overall = "一致" if all(results[i] for i in range(1, 13)) else "不完全一致"
# summary table
head = []
head.append("# 测试报告\n\n")
head.append(f"{overall}\n\n")
head.append(
f"HTML 监测时间 {HTML_MONITOR_DATE} 对应平台监测周期 {PLATFORM_PERIOD}"
"页面日期对应不是差异。HTML「综合」对平台「全平台」。"
"差超过 0.05 才算不同。排行榜只比各自 Top 10。\n\n"
)
head.append("## 参数\n\n")
head.append(f"- 平台:{platform_url}\n")
head.append(f"- HTML{html_url}\n")
head.append(f"- url日期{PLATFORM_PERIOD}\n")
head.append(f"- html日期{HTML_MONITOR_DATE}\n")
head.append(f"- batchId`{api.get('batchId')}`\n")
head.append(f"- 保存目录:{REPORT_DIR}\n\n")
head.append("## 十二项结论\n\n")
head.append("| 项 | 结果 |\n|---|---|\n")
labels = {
1: "1 两个 URL 能否打开",
2: "2 七个 AI 平台",
3: "3 露出率、前三率、正面率",
4: "4 分平台核心指标",
5: "5 露出排行 · 各平台明细",
6: "6 正面词、负面词",
7: "7 信源内容类型",
8: "8 信源发布时间",
9: "9 媒体类型前 10",
10: "10 媒体名称前 10",
11: "11 关联信源标题、渠道、被引次数",
12: "12 关联信源标题序号",
}
for i in range(1, 13):
head.append(f"| {labels[i]} | {mark(results[i])} |\n")
head.append("\n")
out_path = REPORT_DIR / f"测试报告-{report_id}-{pid}.md"
out_path.write_text("".join(head) + "".join(sections), encoding="utf-8")
return overall, out_path, all(results[i] for i in range(1, 13))
def main() -> None:
batch = json.loads(BATCH.read_text(encoding="utf-8"))
lines = ["# batch_0830 汇总\n\n", "| project_id | 结论 | 报告 |\n|---|---|---|\n"]
for item in batch:
overall, path, ok = compare_project(item)
lines.append(f"| {item['project_id']} | {overall} | `{path.name}` |\n")
print(item["project_id"], overall, path, flush=True)
(REPORT_DIR / "_summary.md").write_text("".join(lines), encoding="utf-8")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,13 @@
# batch_0906 汇总
| project_id | 结论 | 报告 |
|---|---|---|
| 1169 | 不完全一致 | `测试报告-1-1169.md` |
| 1170 | 一致 | `测试报告-1-1170.md` |
| 1171 | 一致 | `测试报告-1-1171.md` |
| 1173 | 一致 | `测试报告-1-1173.md` |
| 1174 | 一致 | `测试报告-1-1174.md` |
| 1177 | 一致 | `测试报告-1-1177.md` |
| 1179 | 一致 | `测试报告-1-1179.md` |
| 1187 | 一致 | `测试报告-1-1187.md` |
| 1199 | 一致 | `测试报告-1-1199.md` |

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -0,0 +1,169 @@
# 测试报告
不完全一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1169&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/52e7ca36-9acd-4b6a-8533-42352d1b00b9.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1169-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试失败❌ |
| 12 关联信源标题序号 | 测试失败❌ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 卖点词。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1169/html-open.png)
![平台页面](shots-1-1169/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 18.8% / 16.5% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 查博士 | 查博士 |
| 3 | 懂车帝 | 懂车帝 |
| 4 | 优信二手车 | 优信二手车 |
| 5 | 澳康达 | 澳康达 |
| 6 | 淘车二手车 | 淘车二手车 |
| 7 | 闲鱼 | 闲鱼 |
| 8 | 268V | 268V |
| 9 | 检车家 | 检车家 |
| 10 | 花乡 | 花乡 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试失败❌
按标题对齐,不比序号。只取前 30。
| 平台 | 说明 | a | b | c |
|---|---|---|---|---|
| 文心 | 标题集合不同 | 30 | 30 | 2 |
## 12. 关联信源标题序号 测试失败❌
比画面序号上的标题。平台按 cite_count 降序稳定排序。
| 平台 | 序号 | HTML 标题 | 平台标题 | HTML次数 | 平台次数 | 说明 |
|---|---|---|---|---|---|---|
| 文心 | 30 | 一辆2024年买回来的新能源车,表显3万公里,落地价60万,车主把手续都备齐了,直接开到二手车市场准 | 一辆2024年买回来的新能源车,表显3万公里,落地价60万,车主把手续都备齐了,直接开到二手车市场准 | 1 | 1 | 并列换位,不是缺标题 |

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1170&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/a92d07ce-1e57-4dee-a2a5-ad893bd08806.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1170-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 购买场景词。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1170/html-open.png)
![平台页面](shots-1-1170/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 19.8% / 15.6% / 99.7%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 优信二手车 | 优信二手车 |
| 3 | 查博士 | 查博士 |
| 4 | 懂车帝 | 懂车帝 |
| 5 | 澳康达 | 澳康达 |
| 6 | 淘车二手车 | 淘车二手车 |
| 7 | 花乡 | 花乡 |
| 8 | 人人车 | 人人车 |
| 9 | 闲鱼 | 闲鱼 |
| 10 | 汽车之家 | 汽车之家 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个。负面词条相同3 个)。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1171&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/216ef3e0-5c7a-4304-bf6e-e0d52e6c1c3d.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1171-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 价格词。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1171/html-open.png)
![平台页面](shots-1-1171/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 6.4% / 6.4% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 懂车帝 | 懂车帝 |
| 3 | 查博士 | 查博士 |
| 4 | 淘车二手车 | 淘车二手车 |
| 5 | 优信二手车 | 优信二手车 |
| 6 | 闲鱼 | 闲鱼 |
| 7 | 花乡 | 花乡 |
| 8 | 人人车 | 人人车 |
| 9 | 车300 | 车300 |
| 10 | 汽车之家 | 汽车之家 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1173&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/a57a0750-7305-4f27-888e-19387da469c4.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1173-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 口碑评价。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1173/html-open.png)
![平台页面](shots-1-1173/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 100.0% / 99.7% / 87.7%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 卡泰驰 | 卡泰驰 |
| 2 | 汽车之家 | 汽车之家 |
| 3 | 查博士 | 查博士 |
| 4 | 瓜子二手车 | 瓜子二手车 |
| 5 | 懂车帝 | 懂车帝 |
| 6 | 二手车之家 | 二手车之家 |
| 7 | 优信二手车 | 优信二手车 |
| 8 | 268V | 268V |
| 9 | 澳康达 | 澳康达 |
| 10 | 检车家 | 检车家 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个。负面词条相同20 个)。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1174&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/8d1398b3-4214-4ef5-887d-d3286371a4b1.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1174-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 宝马。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1174/html-open.png)
![平台页面](shots-1-1174/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 5.0% / 4.8% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 查博士 | 查博士 |
| 3 | 懂车帝 | 懂车帝 |
| 4 | 优信二手车 | 优信二手车 |
| 5 | 检车家 | 检车家 |
| 6 | 闲鱼 | 闲鱼 |
| 7 | 澳康达 | 澳康达 |
| 8 | 人人车 | 人人车 |
| 9 | 花乡 | 花乡 |
| 10 | 268V | 268V |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1177&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/372c7809-01c5-4593-a976-c6baf78f79aa.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1177-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 奥迪。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1177/html-open.png)
![平台页面](shots-1-1177/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 21.2% / 18.6% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 查博士 | 查博士 |
| 3 | 优信二手车 | 优信二手车 |
| 4 | 懂车帝 | 懂车帝 |
| 5 | 闲鱼 | 闲鱼 |
| 6 | 澳康达 | 澳康达 |
| 7 | 卡泰驰 | 卡泰驰 |
| 8 | 检车家 | 检车家 |
| 9 | 车300 | 车300 |
| 10 | 花乡 | 花乡 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1179&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/20e26edc-3e46-4810-9a19-bd3d5638b243.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1179-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 新能源。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1179/html-open.png)
![平台页面](shots-1-1179/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 12.8% / 10.2% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 转转 | 转转 |
| 3 | 懂车帝 | 懂车帝 |
| 4 | 闲鱼 | 闲鱼 |
| 5 | 查博士 | 查博士 |
| 6 | 优信二手车 | 优信二手车 |
| 7 | 淘车二手车 | 淘车二手车 |
| 8 | 澳康达 | 澳康达 |
| 9 | 汽车之家 | 汽车之家 |
| 10 | 帅车 | 帅车 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1187&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/7fd6a885-42b0-463e-ae86-c60a20655841.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1187-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 奔驰。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1187/html-open.png)
![平台页面](shots-1-1187/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 9.8% / 9.3% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 查博士 | 查博士 |
| 3 | 懂车帝 | 懂车帝 |
| 4 | 优信二手车 | 优信二手车 |
| 5 | 花乡 | 花乡 |
| 6 | 闲鱼 | 闲鱼 |
| 7 | 帅车 | 帅车 |
| 8 | 澳康达 | 澳康达 |
| 9 | 淘车二手车 | 淘车二手车 |
| 10 | 人人车 | 人人车 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-06 对应平台监测周期 9月 W36。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-06&reportType=monitor&level=project&project=1199&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/b45ffa99-f2b2-44d4-b88f-7c2c50ad95bc.html
- url日期9月 W36
- html日期2026-09-06
- batchId`KATECHI-HIST-1199-20260906`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0906-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-06项目为 竞品对比。平台页监测周期为 9月 W36。
![HTML 页面](shots-1-1199/html-open.png)
![平台页面](shots-1-1199/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 88.5% / 86.2% / 93.5%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 卡泰驰 | 卡泰驰 |
| 2 | 帅车 | 帅车 |
| 3 | 澳康达 | 澳康达 |
| 4 | 优信二手车 | 优信二手车 |
| 5 | 查博士 | 查博士 |
| 6 | 58同城 | 58同城 |
| 7 | 瓜子二手车 | 瓜子二手车 |
| 8 | 汽车之家 | 汽车之家 |
| 9 | 淘车二手车 | 淘车二手车 |
| 10 | 懂车帝 | 懂车帝 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个。负面词条相同20 个)。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,748 @@
# -*- coding: utf-8 -*-
"""L1 HTML vs platform screen-value compare for batch_0830."""
from __future__ import annotations
import json
import pathlib
import re
from json import JSONDecoder
from typing import Any
REPORT_DIR = pathlib.Path(r"D:\test\灌数\卡泰驰\项目级\monitor-0920-test")
HTML_DIR = REPORT_DIR / "_html"
API_DIR = REPORT_DIR / "_api"
BATCH = pathlib.Path(
r"D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\batch_0920.json"
)
PLATFORM_PERIOD = "9月 W38"
HTML_MONITOR_DATE = "2026-09-20"
TOL = 0.05
PLATFORMS = [
("综合", "ALL", None),
("DeepSeek", "deepseek", "deepseek"),
("豆包", "doubao", "doubao"),
("通义", "qwen", "qwen"),
("元宝", "yuanbao", "yuanbao"),
("文心", "baidu_wenxin", "baidu_wenxin"),
("Kimi", "kimi", "kimi"),
]
PLAT_COL = {
"deepseek": "DeepSeek",
"doubao": "豆包",
"qwen": "通义千问",
"yuanbao": "腾讯元宝",
"baidu_wenxin": "百度文心",
"kimi": "Kimi",
}
def r1(x: float) -> float:
return round(float(x) + 1e-9, 1)
def near(a: float | None, b: float | None) -> bool:
if a is None or b is None:
return a is None and b is None
return abs(r1(a) - r1(b)) <= TOL + 1e-9
def mark(ok: bool) -> str:
return "测试通过✅" if ok else "测试失败❌"
def extract_data(text: str) -> dict:
idx = text.find("var DATA")
if idx < 0:
raise ValueError("no DATA")
brace = text.find("{", idx)
obj, _ = JSONDecoder().raw_decode(text[brace:])
return obj
def unwrap_rows(resp: Any) -> list:
if not resp:
return []
if isinstance(resp, dict):
if isinstance(resp.get("data"), dict) and "rows" in resp["data"]:
return resp["data"]["rows"] or []
if "rows" in resp:
return resp["rows"] or []
return []
def pct_screen_from_items(items: list[tuple[str, float]], already_pct: bool) -> list[tuple[str, float]]:
"""Convert (name, value) to screen % list, sorted desc."""
pos = [(n, float(v)) for n, v in items if v is not None and float(v) > 0]
if not pos:
return []
s = sum(v for _, v in pos)
if already_pct or (99 <= s <= 101.5) or all(0 < v <= 100 for _, v in pos) and 99 <= s <= 101.5:
out = [(n, r1(v)) for n, v in pos]
else:
out = [(n, r1(v / s * 100)) for n, v in pos]
out.sort(key=lambda t: (-t[1], t[0]))
return out
def is_value_already_pct(values: list[float]) -> bool:
pos = [v for v in values if v and v > 0]
if not pos:
return True
s = sum(pos)
if 99 <= s <= 101.5:
return True
if all(0 < v <= 100 for v in pos) and 99 <= s <= 101.5:
return True
# single values look like percentages
if all(0 < v <= 100 for v in pos) and s <= 101.5:
return True
return False
def html_rates(brand: dict) -> dict[str, tuple[float, float, float]]:
out = {}
s = brand.get("summary") or {}
out["ALL"] = (
float(s.get("avg_exposure_rate") or 0),
float(s.get("avg_top3_rate") or 0),
float(s.get("avg_positive_mention_rate") or 0),
)
for key, _, hkey in PLATFORMS[1:]:
self = ((brand.get("platforms") or {}).get(hkey) or {}).get("self") or {}
out[hkey] = (
float(self.get("exposure_rate") or 0),
float(self.get("top3_rate") or 0),
float(self.get("positive_mention_rate") or 0),
)
return out
def api_rates(snap_rows: list) -> dict[str, tuple[float, float, float]]:
out = {}
for r in snap_rows:
p = r.get("platform")
m = r.get("metrics") or {}
out[p] = (
float(m.get("exposure_rate") or 0),
float(m.get("top3_rate") or 0),
float(m.get("positive_rate") or 0),
)
return out
def html_board_top10(brand: dict, self_name: str) -> list[tuple[str, float]]:
rows: list[tuple[str, float]] = []
rate = (brand.get("summary") or {}).get("avg_exposure_rate")
if rate is not None:
rows.append((self_name, float(rate)))
for x in brand.get("core_competitors") or []:
name = x.get("product")
r = x.get("avg_exposure_rate")
if name is None or r is None:
continue
rows.append((str(name), float(r)))
rows.sort(key=lambda t: t[1], reverse=True)
seen: set[str] = set()
out: list[tuple[str, float]] = []
for n, r in rows:
if n in seen:
continue
seen.add(n)
out.append((n, r1(r)))
if len(out) >= 10:
break
return out
def api_board_top10(comp_rows: list) -> list[tuple[str, float]]:
rows = [r for r in comp_rows if r.get("platform") == "ALL"]
scored = []
for r in rows:
name = r.get("competitor_name") or r.get("brand") or ""
er = (r.get("metrics") or {}).get("exposure_rate")
if name is None or er is None:
continue
scored.append((str(name), float(er)))
scored.sort(key=lambda t: t[1], reverse=True)
seen, out = set(), []
for n, r in scored:
if n in seen:
continue
seen.add(n)
out.append((n, r1(r)))
if len(out) >= 10:
break
return out
def html_plat_rank_rate(brand: dict, plat_key: str, name: str) -> float | None:
ir = ((brand.get("platforms") or {}).get(plat_key) or {}).get("industry_ranking") or []
for x in ir:
if str(x.get("brand") or "") == name:
v = x.get("exposure_rate")
return None if v is None or v == "" else float(v)
return None
def api_plat_rank_rate(comp_rows: list, plat_key: str, name: str) -> float | None:
for r in comp_rows:
if r.get("platform") != plat_key:
continue
if str(r.get("competitor_name") or "") != name:
continue
v = (r.get("metrics") or {}).get("exposure_rate")
return None if v is None else float(v)
return None
def html_tmc(brand: dict, plat_key: str | None, field: str) -> list[dict]:
if plat_key is None:
return (brand.get("tmc_aggregate") or {}).get(field) or []
return (
((brand.get("platforms") or {}).get(plat_key) or {}).get("citation") or {}
).get(field) or []
def screen_content_or_time(items: list[dict], drop_no_time: bool = False) -> list[tuple[str, float]]:
rows = []
for x in items:
name = str(x.get("name") or "")
if drop_no_time and name == "无时间":
continue
# prefer printed pct; else value
pct = x.get("pct")
val = x.get("value")
if pct is not None:
rows.append((name, float(pct)))
elif val is not None:
rows.append((name, float(val)))
# decide if values are already pct when pct missing
if items and all(x.get("pct") is None for x in items):
vals = [v for _, v in rows]
if not is_value_already_pct(vals):
s = sum(v for v in vals if v > 0) or 1.0
rows = [(n, v / s * 100 if v > 0 else 0.0) for n, v in rows]
rows = [(n, r1(v)) for n, v in rows if v and v > 0]
rows.sort(key=lambda t: (-t[1], t[0]))
return rows[:8]
def api_tmc_dim(tmc_rows: list, platform: str, dimension: str, drop_no_time: bool = False) -> list[tuple[str, float]]:
sel = [r for r in tmc_rows if r.get("platform") == platform and r.get("dimension") == dimension]
items = []
for r in sel:
name = str(r.get("name") or "")
if drop_no_time and name == "无时间":
continue
v = r.get("value")
if v is None:
continue
items.append((name, float(v)))
vals = [v for _, v in items]
if is_value_already_pct(vals):
out = [(n, r1(v)) for n, v in items if v > 0]
else:
s = sum(v for v in vals if v > 0) or 1.0
out = [(n, r1(v / s * 100)) for n, v in items if v > 0]
out.sort(key=lambda t: (-t[1], t[0]))
return out[:8]
def html_media_type(items: list[dict]) -> list[tuple[str, float]]:
rows = []
for x in items:
name = str(x.get("name") or "")
if name in ("其他", "未知"):
continue
v = x.get("value")
if v is None:
continue
rows.append((name, float(v)))
s = sum(v for _, v in rows if v > 0) or 1.0
out = [(n, r1(v / s * 100)) for n, v in rows if v > 0]
out.sort(key=lambda t: (-t[1], t[0]))
return out[:10]
def html_media_name(items: list[dict]) -> list[tuple[str, float]]:
rows = []
for x in items:
name = str(x.get("name") or "")
if name in ("其他", "未知"):
continue
v = x.get("value")
if v is None:
continue
rows.append((name, float(v)))
s = sum(v for _, v in rows if v > 0) or 1.0
out = [(n, r1(v / s * 100)) for n, v in rows if v > 0]
out.sort(key=lambda t: (-t[1], t[0]))
return out[:10]
def api_media_bar(tmc_rows: list, platform: str, dimension: str) -> list[tuple[str, float]]:
sel = [r for r in tmc_rows if r.get("platform") == platform and r.get("dimension") == dimension]
items = [(str(r.get("name") or ""), float(r.get("value") or 0)) for r in sel]
items = [(n, v) for n, v in items if n and v > 0]
items.sort(key=lambda t: (-t[1], t[0]))
top = items[:10]
s = sum(v for _, v in top)
if s <= 101.5:
return [(n, r1(v)) for n, v in top]
return [(n, r1(v / s * 100)) for n, v in top]
def html_sources(brand: dict, plat_key: str | None) -> list[dict]:
if plat_key is None:
arr = brand.get("source_top30") or []
else:
arr = ((brand.get("platforms") or {}).get(plat_key) or {}).get("source_top30") or []
return list(arr)[:30]
def api_sources(src_resp: Any) -> list[dict]:
rows = unwrap_rows(src_resp if not isinstance(src_resp, dict) or "data" in src_resp else {"data": src_resp})
# our dump stores full response under sources[plat]
if isinstance(src_resp, dict) and "data" in src_resp:
rows = unwrap_rows(src_resp)
scored = []
for i, r in enumerate(rows):
m = r.get("metrics") or {}
cite = m.get("cite_count")
if cite is None:
cite = r.get("cite_count") or 0
scored.append((float(cite), i, r))
scored.sort(key=lambda t: (-t[0], t[1]))
out = []
for cite, _, r in scored[:30]:
out.append(
{
"title": str(r.get("title") or ""),
"channel_name": str(r.get("channel_name") or ""),
"cite_count": int(cite) if float(cite).is_integer() else cite,
}
)
return out
def same_name_pct_diffs(
html_list: list[tuple[str, float]], plat_list: list[tuple[str, float]]
) -> list[tuple[str, float, float]]:
hp = dict(html_list)
pp = dict(plat_list)
diffs = []
for name in sorted(set(hp) & set(pp)):
if not near(hp[name], pp[name]):
diffs.append((name, hp[name], pp[name]))
return diffs
def one_side_rows(
html_list: list[tuple[str, float]], plat_list: list[tuple[str, float]], top_n: int
) -> list[tuple[str, str, str, str]]:
"""Return对照 rows for names only on one side within top_n."""
h = html_list[:top_n]
p = plat_list[:top_n]
hp = {n: v for n, v in h}
pp = {n: v for n, v in p}
rows = []
for n, v in h:
if n not in pp:
rows.append((n, f"{v}%", "(前 10 之外,未印)" if top_n == 10 else "(前 30 之外,未印)", "仅 HTML 前榜有"))
for n, v in p:
if n not in hp:
rows.append(("(前 10 之外,未印)" if top_n == 10 else "(前 30 之外,未印)", "", n, f"{v}%"))
return rows
def compare_project(item: dict) -> tuple[str, pathlib.Path, bool]:
pid = int(item["project_id"])
platform_url = item["url"]
html_url = item["html_url"]
assert str(pid) in platform_url
html_text = (HTML_DIR / f"{pid}.html").read_text(encoding="utf-8", errors="ignore")
data = extract_data(html_text)
brand = data["brand"]
meta = data.get("meta") or {}
self_name = str(meta.get("brand") or brand.get("label") or "卡泰驰")
api = json.loads((API_DIR / f"{pid}.json").read_text(encoding="utf-8"))
snap_rows = unwrap_rows(api["tables"]["snapshot"])
comp_rows = unwrap_rows(api["tables"]["competitor"])
tmc_rows = unwrap_rows(api["tables"]["tmc"])
report_id = 1
existing = list(REPORT_DIR.glob(f"测试报告-*-{pid}.md"))
if existing:
nums = []
for f in existing:
m = re.match(rf"测试报告-(\d+)-{pid}\.md$", f.name)
if m:
nums.append(int(m.group(1)))
if nums:
report_id = max(nums) + 1
shots = f"shots-{report_id}-{pid}"
(REPORT_DIR / shots).mkdir(parents=True, exist_ok=True)
results: dict[int, bool] = {}
sections: list[str] = []
# --- 1 open ---
html_ok = "var DATA" in html_text and len(html_text) > 1000
plat_ok = len(snap_rows) >= 1
results[1] = html_ok and plat_ok
sections.append(f"## 1. 页面打开 {mark(results[1])}\n\n")
sections.append(
f"两个 URL 都能打开。HTML 页头监测日期对应 {HTML_MONITOR_DATE},项目为 {meta.get('subtitle_product') or meta.get('question') or self_name}"
f"平台页监测周期为 {PLATFORM_PERIOD}\n\n"
)
sections.append(f"![HTML 页面]({shots}/html-open.png)\n\n")
sections.append(f"![平台页面]({shots}/platform-open.png)\n\n")
# --- 2 platforms ---
results[2] = True # 约定映射
sections.append("## 2. 七个 AI 平台 测试通过✅\n\n")
sections.append(
"综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。\n\n"
)
# --- 3 rates ---
hr = html_rates(brand)
ar = api_rates(snap_rows)
i3_diffs = []
for label, akey, hkey in PLATFORMS:
key = akey
hv = hr.get(hkey if hkey else "ALL") or hr.get("ALL")
# fix mapping
if hkey is None:
hv = hr["ALL"]
else:
hv = hr[hkey]
pv = ar.get(akey)
if pv is None:
i3_diffs.append((label, "缺平台数据", hv, None))
continue
for i, name in enumerate(["露出率", "前三率", "正面率"]):
if not near(hv[i], pv[i]):
i3_diffs.append((label, name, hv[i], pv[i]))
results[3] = not i3_diffs
sections.append(f"## 3. 露出率、前三率、正面率 {mark(results[3])}\n\n")
if results[3]:
s = hr["ALL"]
sections.append(
f"7 个平台相同。综合为 {r1(s[0])}% / {r1(s[1])}% / {r1(s[2])}%。\n\n"
"综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。\n\n"
)
else:
sections.append("| 平台 | 指标 | HTML | 平台 |\n|---|---|---|---|\n")
for row in i3_diffs:
sections.append(f"| {row[0]} | {row[1]} | {row[2]} | {row[3]} |\n")
sections.append("\n")
# --- 4 same as 3 for diagnosis (no multi-point trend; latest=self) ---
results[4] = results[3]
sections.append(f"## 4. 分平台核心指标 {mark(results[4])}\n\n")
sections.append(
"本批为 diagnosisHTML 各平台 `self` 最新点对平台 snapshot 分平台三项。"
"综合覆盖六个平台的这三个点。\n\n"
)
if results[4]:
sections.append("综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。\n\n")
else:
sections.append("与第 3 项相同差异,见上表。\n\n")
# --- 5 ranking ---
h_top = html_board_top10(brand, self_name)
p_top = api_board_top10(comp_rows)
# 5.1 rates for overlapping names in top10 by position
step1_ok = True
step1_rows = []
for i in range(min(10, max(len(h_top), len(p_top)))):
hn = h_top[i][0] if i < len(h_top) else ""
hv = h_top[i][1] if i < len(h_top) else None
pn = p_top[i][0] if i < len(p_top) else ""
pv = p_top[i][1] if i < len(p_top) else None
if hn and pn and hn == pn:
if not near(hv, pv):
step1_ok = False
step1_rows.append((i + 1, hn, hv, pv))
elif hn != pn:
step1_ok = False
step1_rows.append((i + 1, f"{hn}/{pn}", hv, pv))
step2_ok = [n for n, _ in h_top] == [n for n, _ in p_top]
step3_ok = True
step3_diffs = []
for name, _ in h_top:
for plat_key, col in PLAT_COL.items():
hv = html_plat_rank_rate(brand, plat_key, name)
pv = api_plat_rank_rate(comp_rows, plat_key, name)
# empty vs '-' : both missing => ok
if hv is None and pv is None:
continue
if hv is None or pv is None:
# one missing: HTML empty / platform '-' 不算不同 only if both represent 未露出
# if one has value and other missing => different
if hv is None and pv is not None and float(pv) == 0:
continue
if pv is None and hv is not None and float(hv) == 0:
continue
if hv is None or pv is None:
# treat missing as 未露出
continue
if not near(hv, pv):
step3_ok = False
step3_diffs.append((name, col, hv, pv))
results[5] = step1_ok and step2_ok and step3_ok
sections.append(f"## 5. 露出排行 · 各平台明细 {mark(results[5])}\n\n")
sections.append(
"HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。"
"两边按平均露出率降序取 Top 10。\n\n"
)
sections.append(f"### 5.1 综合平均露出率对全平台列 {mark(step1_ok)}\n\n")
if step1_ok:
sections.append("Top 10 同名露出率无差异。\n\n")
else:
sections.append("| 排名 | 品牌 | HTML | 平台 |\n|---|---|---|---|\n")
for r in step1_rows:
sections.append(f"| {r[0]} | {r[1]} | {r[2]} | {r[3]} |\n")
sections.append("\n")
sections.append(f"### 5.2 综合 Top 10 名次和品牌名 {mark(step2_ok)}\n\n")
sections.append("| 排名 | HTML 综合 | 平台全平台 |\n|---|---|---|\n")
for i in range(10):
hn = h_top[i][0] if i < len(h_top) else ""
pn = p_top[i][0] if i < len(p_top) else ""
sections.append(f"| {i+1} | {hn} | {pn} |\n")
sections.append("\n")
sections.append(f"### 5.3 Top10 品牌分平台露出率 {mark(step3_ok)}\n\n")
if step3_ok:
sections.append("DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。\n\n")
else:
sections.append("| 品牌 | 平台列 | HTML | 平台 |\n|---|---|---|---|\n")
for r in step3_diffs[:50]:
sections.append(f"| {r[0]} | {r[1]} | {r[2]} | {r[3]} |\n")
sections.append("\n")
# --- 6 wordcloud ---
h_pos = {str(x.get("word")) for x in (brand.get("wordcloud") or {}).get("positive") or []}
h_neg = {str(x.get("word")) for x in (brand.get("wordcloud") or {}).get("negative") or []}
wc_data = (api.get("wordcloud") or {}).get("data") or {}
words = wc_data.get("words") or []
p_pos = {str(w.get("word")) for w in words if (w.get("sentiment") or "").lower() == "positive"}
p_neg = {str(w.get("word")) for w in words if (w.get("sentiment") or "").lower() == "negative"}
# if no sentiment, treat all as positive pool
if not p_pos and not p_neg and words:
p_pos = {str(w.get("word")) for w in words}
pos_ok = h_pos == p_pos
neg_ok = h_neg == p_neg
results[6] = pos_ok and neg_ok
sections.append(f"## 6. 正面词、负面词 {mark(results[6])}\n\n")
sections.append(
"文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;"
"未监测到负面词=中正面率100%,暂无负面词。\n\n"
)
if results[6]:
sections.append(
f"正面词条相同({len(h_pos)} 个)。"
+ ("两边均无负面词。" if not h_neg else f"负面词条相同({len(h_neg)} 个)。")
+ "\n\n"
)
else:
only_h = sorted(h_pos - p_pos)
only_p = sorted(p_pos - h_pos)
sections.append(f"正面词仅 HTML{only_h[:20]}\n\n正面词仅平台:{only_p[:20]}\n\n")
if h_neg != p_neg:
sections.append(f"负面词仅 HTML{sorted(h_neg-p_neg)}\n\n负面词仅平台:{sorted(p_neg-h_neg)}\n\n")
# helpers for 7-10
def emit_pct_section(num: int, title: str, field_html: str, dim_api: str, top_n: int, drop_no_time: bool = False):
diffs_by_plat = {}
ok = True
for label, akey, hkey in PLATFORMS:
if field_html in ("content_distribution", "time_distribution"):
h_list = screen_content_or_time(html_tmc(brand, hkey, field_html), drop_no_time=drop_no_time)
p_list = api_tmc_dim(tmc_rows, akey, dim_api, drop_no_time=drop_no_time)
elif field_html == "media_category":
h_list = html_media_type(html_tmc(brand, hkey, field_html))
p_list = api_media_bar(tmc_rows, akey, dim_api)
else:
h_list = html_media_name(html_tmc(brand, hkey, field_html))
p_list = api_media_bar(tmc_rows, akey, dim_api)
d = same_name_pct_diffs(h_list, p_list)
# one-side in top_n also counts as fail for media; for content/time skill focuses on same-name pct
if field_html in ("media_category", "media_name"):
h_names = {n for n, _ in h_list[:top_n]}
p_names = {n for n, _ in p_list[:top_n]}
# 「其他」 only on platform is noted but may not fail if not squeezing — skill says separate table
extra_p = p_names - h_names - {"其他"}
extra_h = h_names - p_names
if extra_p or extra_h:
ok = False
if d:
ok = False
diffs_by_plat[label] = (d, h_list, p_list)
results[num] = ok
sections.append(f"## {num}. {title} {mark(ok)}\n\n")
for label, (d, h_list, p_list) in diffs_by_plat.items():
if not d:
sections.append(f"{label}:画面上同名占比无差异。\n\n")
else:
sections.append(f"{label} 同名占比不同:\n\n")
sections.append("| 名称 | HTML 画面值 | 平台画面值 |\n|---|---|---|\n")
for name, hv, pv in d:
sections.append(f"| {name} | {hv}% | {pv}% |\n")
sections.append("\n")
if field_html in ("media_category", "media_name"):
side = one_side_rows(h_list, p_list, top_n)
# filter 其他-only platform note
other = [x for x in p_list if x[0] == "其他"]
if other and other[0][0] not in dict(h_list):
sections.append(
f"{label} 平台前 10 有「其他」={other[0][1]}%HTML 不画「其他」。\n\n"
)
real_side = [s for s in side if s[0] != "其他" and s[2] != "其他"]
if real_side:
sections.append(f"{label} 仅一边进入前 {top_n}\n\n")
sections.append("| HTML 名 | HTML 值 | 平台名 | 平台值 |\n|---|---|---|---|\n")
for s in real_side:
sections.append(f"| {s[0]} | {s[1]} | {s[2]} | {s[3]} |\n")
sections.append("\n")
emit_pct_section(7, "信源内容类型", "content_distribution", "content_type", 8)
emit_pct_section(8, "信源发布时间", "time_distribution", "time_distribution", 8, drop_no_time=True)
emit_pct_section(9, "媒体类型前 10", "media_category", "media_category", 10)
emit_pct_section(10, "媒体名称前 10", "media_name", "media_name", 10)
# --- 11 / 12 sources ---
i11_ok = True
i12_ok = True
i11_details = []
i12_details = []
for label, akey, hkey in PLATFORMS:
hs = html_sources(brand, hkey)
ps = api_sources(api["sources"][akey])
# 11: align by title set — channel + cite
h_by_title = {}
for x in hs:
t = str(x.get("title") or "")
h_by_title[t] = (
str(x.get("channel_name") or x.get("channel") or ""),
int(x.get("cite_count") or 0),
)
p_by_title = {x["title"]: (x["channel_name"], int(x["cite_count"])) for x in ps}
# set equality of titles
if set(h_by_title) != set(p_by_title):
# allow count mismatch when <30
if not (len(hs) < 30 and len(ps) < 30 and set(h_by_title) == set(p_by_title)):
if set(h_by_title) != set(p_by_title):
i11_ok = False
i11_details.append((label, "标题集合不同", len(hs), len(ps), len(set(h_by_title) ^ set(p_by_title))))
for t, (hc, hcite) in h_by_title.items():
if t not in p_by_title:
continue
pc, pcite = p_by_title[t]
if hc != pc or hcite != pcite:
i11_ok = False
i11_details.append((label, t[:40], f"{hc}/{hcite}", f"{pc}/{pcite}", ""))
# 12: order by index
n = min(30, len(hs), len(ps)) if hs and ps else min(30, max(len(hs), len(ps)))
# compare by position up to min length; different lengths fail
if len(hs) != len(ps) and not (len(hs) < 30 and len(ps) < 30 and len(hs) == len(ps)):
# if both truncated at available count and equal ok; else if counts differ fail 12
if len(hs) != len(ps):
i12_ok = False
for i in range(min(len(hs), len(ps), 30)):
ht = str(hs[i].get("title") or "")
pt = ps[i]["title"]
if ht != pt:
i12_ok = False
hc = int(hs[i].get("cite_count") or 0)
pc = int(ps[i]["cite_count"])
note = "并列换位,不是缺标题" if hc == pc else ""
i12_details.append((label, i + 1, ht[:50], pt[:50], hc, pc, note))
results[11] = i11_ok
results[12] = i12_ok
sections.append(f"## 11. 关联信源标题、渠道、被引次数 {mark(results[11])}\n\n")
sections.append("按标题对齐,不比序号。只取前 30。\n\n")
if results[11]:
sections.append("七个平台:标题集合及渠道、被引次数相同。\n\n")
else:
sections.append("| 平台 | 说明 | a | b | c |\n|---|---|---|---|---|\n")
for row in i11_details[:40]:
sections.append("| " + " | ".join(str(x) for x in row) + " |\n")
sections.append("\n")
sections.append(f"## 12. 关联信源标题序号 {mark(results[12])}\n\n")
sections.append("比画面序号上的标题。平台按 cite_count 降序稳定排序。\n\n")
if results[12]:
sections.append("七个平台:前 30 序号标题相同。\n\n")
else:
sections.append("| 平台 | 序号 | HTML 标题 | 平台标题 | HTML次数 | 平台次数 | 说明 |\n|---|---|---|---|---|---|---|\n")
for row in i12_details[:60]:
sections.append("| " + " | ".join(str(x) for x in row) + " |\n")
sections.append("\n")
overall = "一致" if all(results[i] for i in range(1, 13)) else "不完全一致"
# summary table
head = []
head.append("# 测试报告\n\n")
head.append(f"{overall}\n\n")
head.append(
f"HTML 监测时间 {HTML_MONITOR_DATE} 对应平台监测周期 {PLATFORM_PERIOD}"
"页面日期对应不是差异。HTML「综合」对平台「全平台」。"
"差超过 0.05 才算不同。排行榜只比各自 Top 10。\n\n"
)
head.append("## 参数\n\n")
head.append(f"- 平台:{platform_url}\n")
head.append(f"- HTML{html_url}\n")
head.append(f"- url日期{PLATFORM_PERIOD}\n")
head.append(f"- html日期{HTML_MONITOR_DATE}\n")
head.append(f"- batchId`{api.get('batchId')}`\n")
head.append(f"- 保存目录:{REPORT_DIR}\n\n")
head.append("## 十二项结论\n\n")
head.append("| 项 | 结果 |\n|---|---|\n")
labels = {
1: "1 两个 URL 能否打开",
2: "2 七个 AI 平台",
3: "3 露出率、前三率、正面率",
4: "4 分平台核心指标",
5: "5 露出排行 · 各平台明细",
6: "6 正面词、负面词",
7: "7 信源内容类型",
8: "8 信源发布时间",
9: "9 媒体类型前 10",
10: "10 媒体名称前 10",
11: "11 关联信源标题、渠道、被引次数",
12: "12 关联信源标题序号",
}
for i in range(1, 13):
head.append(f"| {labels[i]} | {mark(results[i])} |\n")
head.append("\n")
out_path = REPORT_DIR / f"测试报告-{report_id}-{pid}.md"
out_path.write_text("".join(head) + "".join(sections), encoding="utf-8")
return overall, out_path, all(results[i] for i in range(1, 13))
def main() -> None:
batch = json.loads(BATCH.read_text(encoding="utf-8"))
lines = ["# batch_0830 汇总\n\n", "| project_id | 结论 | 报告 |\n|---|---|---|\n"]
for item in batch:
overall, path, ok = compare_project(item)
lines.append(f"| {item['project_id']} | {overall} | `{path.name}` |\n")
print(item["project_id"], overall, path, flush=True)
(REPORT_DIR / "_summary.md").write_text("".join(lines), encoding="utf-8")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,13 @@
# batch_0920 汇总
| project_id | 结论 | 报告 |
|---|---|---|
| 1169 | 一致 | `测试报告-1-1169.md` |
| 1170 | 不完全一致 | `测试报告-1-1170.md` |
| 1171 | 一致 | `测试报告-1-1171.md` |
| 1173 | 一致 | `测试报告-1-1173.md` |
| 1174 | 一致 | `测试报告-1-1174.md` |
| 1177 | 一致 | `测试报告-1-1177.md` |
| 1179 | 一致 | `测试报告-1-1179.md` |
| 1187 | 一致 | `测试报告-1-1187.md` |
| 1199 | 一致 | `测试报告-1-1199.md` |

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1169&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/3899e673-cd92-4670-8203-566cee53a121.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1169-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 卖点词。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1169/html-open.png)
![平台页面](shots-1-1169/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 29.6% / 26.8% / 99.2%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 查博士 | 查博士 |
| 3 | 懂车帝 | 懂车帝 |
| 4 | 优信二手车 | 优信二手车 |
| 5 | 花乡 | 花乡 |
| 6 | 卡泰驰 | 卡泰驰 |
| 7 | 澳康达 | 澳康达 |
| 8 | 淘车二手车 | 淘车二手车 |
| 9 | 268V | 268V |
| 10 | 闲鱼 | 闲鱼 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个。负面词条相同2 个)。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,171 @@
# 测试报告
不完全一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1170&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/b4007bdb-5138-4097-ba18-79b53fdc9c35.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1170-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试失败❌ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 购买场景词。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1170/html-open.png)
![平台页面](shots-1-1170/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 25.7% / 22.4% / 99.7%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 花乡 | 花乡 |
| 3 | 优信二手车 | 优信二手车 |
| 4 | 懂车帝 | 懂车帝 |
| 5 | 查博士 | 查博士 |
| 6 | 淘车二手车 | 淘车二手车 |
| 7 | 澳康达 | 澳康达 |
| 8 | 闲鱼 | 闲鱼 |
| 9 | 卡泰驰 | 卡泰驰 |
| 10 | 汽车之家 | 汽车之家 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个。负面词条相同6 个)。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试失败❌
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
文心 仅一边进入前 10
| HTML 名 | HTML 值 | 平台名 | 平台值 |
|---|---|---|---|
| 政府机构官网 | 0.0% | (前 10 之外,未印) | 仅 HTML 前榜有 |
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1171&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/90f82b55-5c3d-480e-991f-c96d6dfc96dc.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1171-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 价格词。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1171/html-open.png)
![平台页面](shots-1-1171/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 10.1% / 9.5% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 懂车帝 | 懂车帝 |
| 3 | 花乡 | 花乡 |
| 4 | 闲鱼 | 闲鱼 |
| 5 | 查博士 | 查博士 |
| 6 | 淘车二手车 | 淘车二手车 |
| 7 | 优信二手车 | 优信二手车 |
| 8 | 人人车 | 人人车 |
| 9 | 天天拍车 | 天天拍车 |
| 10 | 汽车之家 | 汽车之家 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1173&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/8507f96c-d167-45f9-bd78-0958bc99fba0.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1173-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 口碑评价。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1173/html-open.png)
![平台页面](shots-1-1173/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 95.0% / 95.0% / 86.5%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 卡泰驰 | 卡泰驰 |
| 2 | 汽车之家 | 汽车之家 |
| 3 | 查博士 | 查博士 |
| 4 | 懂车帝 | 懂车帝 |
| 5 | 瓜子二手车 | 瓜子二手车 |
| 6 | 二手车之家 | 二手车之家 |
| 7 | 优信二手车 | 优信二手车 |
| 8 | 检车家 | 检车家 |
| 9 | 澳康达 | 澳康达 |
| 10 | 268V | 268V |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个。负面词条相同20 个)。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1174&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/03a274fd-74e2-4fc8-bcc5-88b5286016f8.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1174-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 宝马。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1174/html-open.png)
![平台页面](shots-1-1174/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 13.8% / 12.6% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 懂车帝 | 懂车帝 |
| 3 | 查博士 | 查博士 |
| 4 | 优信二手车 | 优信二手车 |
| 5 | 花乡 | 花乡 |
| 6 | 268V | 268V |
| 7 | 汽车之家 | 汽车之家 |
| 8 | 闲鱼 | 闲鱼 |
| 9 | 澳康达 | 澳康达 |
| 10 | 卡泰驰 | 卡泰驰 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1177&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/a5fc2516-2de6-41ab-85a1-67a94bde2181.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1177-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 奥迪。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1177/html-open.png)
![平台页面](shots-1-1177/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 35.5% / 34.5% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 澳康达 | 澳康达 |
| 3 | 卡泰驰 | 卡泰驰 |
| 4 | 查博士 | 查博士 |
| 5 | 懂车帝 | 懂车帝 |
| 6 | 优信二手车 | 优信二手车 |
| 7 | 闲鱼 | 闲鱼 |
| 8 | 花乡 | 花乡 |
| 9 | 检车家 | 检车家 |
| 10 | 268V | 268V |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1179&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/74a34826-4088-4b8e-8b7d-4fdf12007e8b.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1179-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 新能源。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1179/html-open.png)
![平台页面](shots-1-1179/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 20.0% / 17.4% / 100.0%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 懂车帝 | 懂车帝 |
| 3 | 转转 | 转转 |
| 4 | 查博士 | 查博士 |
| 5 | 淘车二手车 | 淘车二手车 |
| 6 | 闲鱼 | 闲鱼 |
| 7 | 优信二手车 | 优信二手车 |
| 8 | 花乡 | 花乡 |
| 9 | 卡泰驰 | 卡泰驰 |
| 10 | 帅车 | 帅车 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个)。两边均无负面词。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1187&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/ef43ba7c-5d22-4df7-99b9-9697d5095f67.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1187-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 奔驰。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1187/html-open.png)
![平台页面](shots-1-1187/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 28.8% / 28.3% / 96.7%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 瓜子二手车 | 瓜子二手车 |
| 2 | 查博士 | 查博士 |
| 3 | 懂车帝 | 懂车帝 |
| 4 | 花乡 | 花乡 |
| 5 | 卡泰驰 | 卡泰驰 |
| 6 | 澳康达 | 澳康达 |
| 7 | 优信二手车 | 优信二手车 |
| 8 | 闲鱼 | 闲鱼 |
| 9 | 检车家 | 检车家 |
| 10 | 人人车 | 人人车 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个。负面词条相同3 个)。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。

View File

@ -0,0 +1,165 @@
# 测试报告
一致。
HTML 监测时间 2026-09-20 对应平台监测周期 9月 W38。页面日期对应不是差异。HTML「综合」对平台「全平台」。差超过 0.05 才算不同。排行榜只比各自 Top 10。
## 参数
- 平台https://haoxian.cemeta.cn/geo-monitor?batchDate=2026-09-20&reportType=monitor&level=project&project=1199&line=%E5%8D%A1%E6%B3%B0%E9%A9%B0::%E6%B1%BD%E8%BD%A6%E5%B9%B3%E5%8F%B0
- HTMLhttps://cemeta-resource-1313090634.cos.ap-beijing.myqcloud.com/workflow/bc21a4ab-c882-4868-adfb-829c649bf6a0.html
- url日期9月 W38
- html日期2026-09-20
- batchId`KATECHI-HIST-1199-20260920`
- 保存目录D:\test\haoxian-script\haoxian_kataichi\skills\L1-geo-html-screen-diff\monitor-0920-test
## 十二项结论
| 项 | 结果 |
|---|---|
| 1 两个 URL 能否打开 | 测试通过✅ |
| 2 七个 AI 平台 | 测试通过✅ |
| 3 露出率、前三率、正面率 | 测试通过✅ |
| 4 分平台核心指标 | 测试通过✅ |
| 5 露出排行 · 各平台明细 | 测试通过✅ |
| 6 正面词、负面词 | 测试通过✅ |
| 7 信源内容类型 | 测试通过✅ |
| 8 信源发布时间 | 测试通过✅ |
| 9 媒体类型前 10 | 测试通过✅ |
| 10 媒体名称前 10 | 测试通过✅ |
| 11 关联信源标题、渠道、被引次数 | 测试通过✅ |
| 12 关联信源标题序号 | 测试通过✅ |
## 1. 页面打开 测试通过✅
两个 URL 都能打开。HTML 页头监测日期对应 2026-09-20项目为 竞品对比。平台页监测周期为 9月 W38。
![HTML 页面](shots-1-1199/html-open.png)
![平台页面](shots-1-1199/platform-open.png)
## 2. 七个 AI 平台 测试通过✅
综合=全平台,通义=通义千问,元宝=腾讯元宝,文心=百度文心DeepSeek、豆包、Kimi 两边写法相同。
## 3. 露出率、前三率、正面率 测试通过✅
7 个平台相同。综合为 86.2% / 82.2% / 89.1%。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 4. 分平台核心指标 测试通过✅
HTML 各平台 self/趋势最新点对平台 snapshot 分平台三项。综合覆盖六个平台的这三个点。
综合、DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 5. 露出排行 · 各平台明细 测试通过✅
HTML「行业露出率排行榜」对平台「露出排行 · 各平台明细」。只比 Top 10。两边按平均露出率降序取 Top 10。
### 5.1 综合平均露出率对全平台列 测试通过✅
Top 10 同名露出率无差异。
### 5.2 综合 Top 10 名次和品牌名 测试通过✅
| 排名 | HTML 综合 | 平台全平台 |
|---|---|---|
| 1 | 卡泰驰 | 卡泰驰 |
| 2 | 帅车 | 帅车 |
| 3 | 汽车之家 | 汽车之家 |
| 4 | 查博士 | 查博士 |
| 5 | 58同城 | 58同城 |
| 6 | 车王 | 车王 |
| 7 | 瓜子二手车 | 瓜子二手车 |
| 8 | 澳康达 | 澳康达 |
| 9 | 优信二手车 | 优信二手车 |
| 10 | 懂车帝 | 懂车帝 |
### 5.3 Top10 品牌分平台露出率 测试通过✅
DeepSeek、豆包、通义、元宝、文心、Kimi画面上同名占比无差异。
## 6. 正面词、负面词 测试通过✅
文案约定AI 回答关键词=AI 认知词云;正面关键词=正面词;未监测到负面词=中正面率100%,暂无负面词。
正面词条相同20 个。负面词条相同20 个)。
## 7. 信源内容类型 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 8. 信源发布时间 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 9. 媒体类型前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 10. 媒体名称前 10 测试通过✅
综合:画面上同名占比无差异。
DeepSeek画面上同名占比无差异。
豆包:画面上同名占比无差异。
通义:画面上同名占比无差异。
元宝:画面上同名占比无差异。
文心:画面上同名占比无差异。
Kimi画面上同名占比无差异。
## 11. 关联信源标题、渠道、被引次数 测试通过✅
按标题对齐,不比序号。只取前 30。
七个平台:标题集合及渠道、被引次数相同。
## 12. 关联信源标题序号 测试通过✅
比画面序号上的标题。平台按 cite_count 降序稳定排序。
七个平台:前 30 序号标题相同。