2016-05-30 8 views
1

私は次のコードでthisウェブサイトからすべての.txtファイルをダウンロードしようとしている:私はこのコードを実行するとBeautifulSoupは、ファイルをダウンロードしない

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)ラインは、正しいファイル名を印刷し、ディレクトリには、正しい名前のファイルが読み込まれますが、ファイルの内容は次のようになります:したがって、私は通信が働いていると確信しているが、私はどのように上に正しくBSを指示していないよ

<!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> 

をfの内容を保存するiles。また

は、私は現在findAll("a")コマンドですべてのファイルをダウンロードするんだけど、実際には、このような*geom.txtたぶん

+0

なぜここに「data/ance_8」というスペースがありますか?すべきではない。これはファイルの内容ではなく、デフォルトのエラーページです。 –

+0

こんにちは。わからない?これは私が変更できるものではありませんか? – Jonny

+0

ページを取得しようとする前に、毎回スペースを削除(replace())するコードを書くことができます。 –

答えて

1

は、あなたはまた、CSSセレクタを使用してgeom.txtが含まれているだけのリンクを取得することができ、リンクを取得するHREFを引っ張っする必要がありますPythonでif substring in main_stringを使用するのと同じです。

links = (a["href"] for a in soup.select("a[href$=geom.txt]")) 
+0

ありがとうございます。しかし、このコードは出力を生成しません。コードはエラーなしでしばらく実行されますが、その後は何もありません。 – Jonny

+0

@ジョニー、それは 'geom.txt'を含むすべてのファイルを取得します、私はコードを自分で実行しました –

+0

OKは私の設定で何かであるかもしれません。あなたはurllibとurllib2の両方を使いますか?あなたの例では、あなただけがそれをumport。 – Jonny

1

あなたがリンク[「のhref」]を使用する必要があります代わりのような名前で特定のファイルをダウンロードしたいですテキスト「ance_8.5x6_2850cm_5004.txt」と「HREF」欄に、あなたが「ance_8.5x6_2850cm_5004.txtを持っている:あなたが持っているテキストで

<li><a href="ance_8.5x6_2850cm_5004.txt"> ance_8.5x6_2850cm_5004.txt</a></li> 

:この方法では、プレゼンテーションにあるスペースを持っていないだろう"、スペースなしで。

2

あなたはhrefではなくリンクのテキストを読んでおり、テキストには余分なスペースが含まれています。これは、のhrefを取得します。あなたがチェックすることができ、ループ内

links = soup.findAll("a", href=True) 
for link in links: 
    print link['href'] 
    urllib.urlretrieve(baseurl+link['href'], link['href']) 

I would actually like to only download specific files with names such as *geom.txt

を、例えば、if "geom" in link['href']:。それは、

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を持つすべてのアンカータグを検索します。

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()) 

利用ストリップ()関数は、あなたのURLからスペースを削除するには、それが正常に動作します:

またgeom.txtで終わるのhrefを見つけるためにあなたのCSSで$=を使用することができます。

+0

ありがとうございます、これは実際に箱から出てきた最初の答えです。 – Jonny

+0

あなたの歓迎は、@パドレイクの答えを使用してパターン名でファイルをダウンロードする。非常に理解しやすい。 – bhansa

関連する問題