我正在尝试脱机复制此网站:ieeghn。这个任务的一部分是下载所有使用Beautiful Soup引用的css/js,并修改到这个新下载的资源的任何外部链接。你知道吗
目前我只使用stringreplace
方法。但我不认为这是有效的,因为我在一个循环中这样做,下面的片段:
local_content = ''
for res in soup.findAll('link', {'rel': 'stylesheet'}):
if not str(res['href']).startswith('data:'):
original_res = res['href']
res['href'] = some_function_to_download_css()
local_content = local_content.replace(original_res, res['href'])
我只为以data:
开头的非嵌入资源保存资源。但问题是,local_content = local_content.replace(original_res, res['href'])
可能会导致我只能将一个外部资源修改为本地资源的问题。其余的仍然引用资源的在线版本。你知道吗
我猜是因为本地内容是一个很长的字符串(看看ieeghn的源代码),所以结果不太好。你知道吗
如何正确地替换给定模式的字符串内容? 或者我必须先将其存储到一个文件并在那里修改它吗?你知道吗
编辑 我发现问题出在这行代码中:
original_res = res['href']
BSoup将以某种方式清除href字符串。在我的例子中,&
将更改为&
。当我试图将原始的href
替换为新下载的本地文件时,str.replace()
根本找不到这个原始值。要么我必须找到一个方法,有原来的HREF或简单地处理这个案件。不得不说,拥有原始的HREF是最好的方法
你已经在替换内容了,某种程度上。。。你知道吗
…在BeautifulSoup的HTML树表示中更新
href
节点的res
属性。你知道吗为了提高效率,您可以缓存已经下载的CSS文件的url,并在下载文件之前查阅缓存。一旦完成了(如果您对BS的属性排序/缩进等没问题),就可以用
str(soup)
获得树的字符串表示。你知道吗引用:http://beautiful-soup-4.readthedocs.org/en/latest/#changing-tag-names-and-attributes
相关问题 更多 >
编程相关推荐