BeautifulSoup没有按预期下载文件

时间:2016-05-30 17:33:53

标签: python beautifulsoup

我正在尝试使用以下代码从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

的特定文件

4 个答案:

答案 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()函数从网址中删除空格,它可以正常工作。