我有一个 URL 列表,我想将它们的每个目标保存在一个单独的文本文件中。
以下是包含 URL 的输入文件的示例:
~$: head -3 url.txt
http://www.uniprot.org/uniprot/P32234.txt
http://www.uniprot.org/uniprot/P05552.txt
http://www.uniprot.org/uniprot/P07701.txt
Run Code Online (Sandbox Code Playgroud)
我目前正在使用 Python 自定义函数来完成此任务。它可以工作,但主要的不便在于:用户必须手动复制粘贴 URL(没有直接的文件输入),并且输出在每行的开头(?二进制)包含一些“b”字符。
~$: head -3 P32234.txt
b' ID 128UP_DROME Reviewed; 368 AA.
'b' AC P32234; Q9V648;
'b' DT 01-OCT-1993, integrated into UniProtKB/Swiss-Prot.
Run Code Online (Sandbox Code Playgroud)
这是 Python 代码:
def html_to_txt():
import urllib.request
url = str(input('Enter URL: '))
page = urllib.request.urlopen(url)
with open(str(input('Enter filename: ')), "w") as f:
for x in page:
f.write(str(x).replace('\\n','\n'))
s= 'Done'
return s
Run Code Online (Sandbox Code Playgroud)
是否有使用某些 Unix 实用程序更简洁的方法?
使用-i
选项:
wget -i ./url.txt
Run Code Online (Sandbox Code Playgroud)
来自man wget
:
-i 文件
--输入文件=文件
从本地或外部文件读取 URL。如果 - 指定为文件,则从标准输入读取 URL。(使用 ./- 从字面上命名为 - 的文件中读取。)如果使用此函数,则命令行上不需要出现 URL。如果命令行和输入文件中都有 URL,则命令行上的 URL 将首先被检索。如果未指定 --force-html,则文件应包含一系列 URL,每行一个。
但是,如果指定--force-html,则文档将被视为html。在这种情况下,您可能会遇到相关链接的问题,您可以通过在文档中添加 "" 或在命令行上指定 --base=url 来解决。
如果文件是外部文件,则如果 Content-Type 与 text/html 匹配,该文件将自动被视为 html。此外,如果没有指定,文件的位置将被隐式用作基本 href。
wget
有一个选项可以做到这一点:
wget --input-file url.txt
Run Code Online (Sandbox Code Playgroud)
将每行读取一个 URLurl.txt
并按顺序将它们下载到当前目录中。
更一般地,您可以将xargs
这种事情与wget
or结合使用curl
:
xargs wget < url.txt
xargs curl -O < url.txt
Run Code Online (Sandbox Code Playgroud)
xargs
读取其输入的每一行,并将其作为参数提供给您给它的命令。这里的命令是wget
or curl -O
,两者都下载一个 URL 并将其保存到当前目录中。< url.txt
提供 的内容url.txt
作为xargs
命令的输入。
您的 Python 代码的问题在于,您从 urllib 中得到的是字节数据,然后您将这些数据直接打印到文件中,该文件将字节字符串化为b'abc\00\0a...'
(这就是您编写字节文字的方式)。