我正在尝试使用以下代码从this网站下载所有.txt文件:
from bs4 import BeautifulSoup as bs
import urllib
import urllib2
baseurl = "http://m-selig.ae.illinois.edu/props/volume-1/data/"
soup = bs(urllib2.urlopen(baseurl), 'lxml')
links = soup.findAll("a")
for link in links:
print link.text
urllib.urlretrieve(baseurl+link.text, link.text)
当我运行此代码时,print(link.text)
行打印正确的文件名,并使用正确名称的文件填充目录,但文件内容如下所示:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /props/volume-1/data/ ance_8.5x6_2849cm_4000.txt was not found on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips mod_bwlimited/1.4 Server at m-selig.ae.illinois.edu Port 80</address>
</body></html>
因此,我确信通信正常,但我没有正确指导BS如何保存文件内容。
另外,我目前正在使用findAll("a")
命令下载所有文件,但我实际上只想下载名称为*geom.txt
答案 0 :(得分:2)
您正在阅读链接的文本,而不是href,并且文本包含额外的空格。这将检索hrefs:
links = soup.findAll("a", href=True)
for link in links:
print link['href']
urllib.urlretrieve(baseurl+link['href'], link['href'])
我实际上只想下载名称为* geom.txt
的特定文件
在循环中,您可以检查,例如if "geom" in link['href']:
。
答案 1 :(得分:1)
也许您应该使用link ['href']而不是文本。这样你就不会有演示文稿中的空间:
<li><a href="ance_8.5x6_2850cm_5004.txt"> ance_8.5x6_2850cm_5004.txt</a></li>
在您的文本中:“ance_8.5x6_2850cm_5004.txt”,在“href”字段中,您有“ance_8.5x6_2850cm_5004.txt”,没有空格。
答案 2 :(得分:1)
你需要拉动href来获取链接,你也可以使用css选择器获得包含geom.txt
的链接:
from bs4 import BeautifulSoup as bs
import urllib
import urllib2
from urlparse import urljoin
baseurl = "http://m-selig.ae.illinois.edu/props/volume-1/data/"
soup = bs(urllib2.urlopen(baseurl), 'lxml')
links = (a["href"] for a in soup.select("a[href*=geom.txt]"))
for link in links:
urllib.urlretrieve(urljoin(baseurl, link), link)
a[href*=geom.txt]
找到所有带有geom.txt
的href的锚标签,相当于在python中使用if substring in main_string
。
你也可以在你的CSS中使用$=
来查找以geom.txt
结尾的href:
links = (a["href"] for a in soup.select("a[href$=geom.txt]"))
答案 3 :(得分:0)
from bs4 import BeautifulSoup as bs
import urllib
import urllib2
baseurl = "http://m-selig.ae.illinois.edu/props/volume-1/data/"
soup = bs(urllib2.urlopen(baseurl), 'lxml')
links = soup.findAll("a")
for link in links:
print link.text
data = urllib.urlopen(baseurl+link.text.strip())
with open(link.text,"wb") as fs:
fs.write(data.read())
使用strip()函数从网址中删除空格,它可以正常工作。