Open saurlax opened 1 week ago
原因是 fork_child 函数的递归传参不当,导致在深层页面内搜集到的其他兄弟页面会被误丢弃,例如:
/
/a
/a
目录,得到 /a/child
和 /b
,因为此时的 base_url
被设置成了 /a
,所以本应该被爬取的页面 /b
被误抛弃了 @staticmethod
def fork_child(child_link: ChildLink, selector_list: List[str], level: int, exclude_link_url: Set[str],
fork_handler):
if level < 0:
return
else:
child_link.url = remove_fragment(child_link.url)
child_url = child_link.url[:-1] if child_link.url.endswith('/') else child_link.url
if not exclude_link_url.__contains__(child_url):
exclude_link_url.add(child_url)
response = Fork(child_link.url, selector_list).fork()
fork_handler(child_link, response)
for child_link in response.child_link_list:
child_url = child_link.url[:-1] if child_link.url.endswith('/') else child_link.url # 这个列表会抛弃所有不是以 `url` 开头的链接
if not exclude_link_url.__contains__(child_url):
ForkManage.fork_child(child_link, selector_list, level - 1, exclude_link_url, fork_handler) # 但是传参的时候是逐级深入的,会导致某些兄弟页面无法被爬取
修复建议
多添加一个 root_url
参数来保证正确传递 base_url
信息。
感谢反馈,我们先排查一下问题
联系方式
saurlax@qq.com
MaxKB 版本
v1.7.0 (build at 2024-10-31T12:49, commit: 44b3aed5)
问题描述
使用 Web 知识库同步某些网站时,只能同步到一两个页面,例如下面的链接:
但是下面的网站却可以正常同步:
怀疑有可能是因为链接跟踪的问题,tauri 的文档在页头中有超链接的
/start
、/concept
、/blog
、/release
开头的就都能同步,而 starlight 的没有这样的规律,就导致了只同步的两个文档。重现步骤
同步 starlight 的参数配置:
结果只得到了首页和第一个页面:
同步 tauri 的参数配置:
结果可以得到所有
/start
、/concept
、/blog
、/release
开头的文档:期待的正确结果
能够同步设置中定义的根目录下的所有页面。
相关日志输出
No response
附加信息
此外建议可以增加从 sitemap 导入的功能,这样对于一些现有支持 sitemap 功能的框架导入效果更好。知识库名称也可以设置为选取页面的 title 而不是超链接的文本。