2016-06-12 4 views
2

次のコードを使用して、BeautifulSoupを使用して多数のリンクを取得しています。それはすべてのリンクを返しますが、私は3番目のリンクを取得し、そのリンクを解析してから3番目のリンクを取得したいと思います。これを達成するために、以下のコードを変更するにはどうすればよいですか?BeautifulSoupの結果から3番目のリンクを取得するには

import urllib 
from BeautifulSoup import * 

url = raw_input('Enter - ') 
html = urllib.urlopen(url).read() 
soup = BeautifulSoup(html) 

# Retrieve all of the anchor tags 
tags = soup('a') 
for tag in tags: 
    print tag.get('href', None) 
    print tag.contents[0] 

答えて

2

まず、BeautifulSoupバージョン3の使用を中止する必要があります。これはかなり古く、管理されていません。 BeautifulSoup version 4に切り替えてください。経由して、それをインストールします。

pip install beautifulsoup4 

とにインポートを変更します。次に

from bs4 import BeautifulSoup 

、あなたはfind_all()を使用して、ページには第三のリンクが存在しなくなるまで再帰的にインデックスにより第三のリンクを取得する必要があります。ここではそれを行うための一つの方法は次のとおりです。

import urllib 
from bs4 import BeautifulSoup 

url = raw_input('Enter - ') 

while True: 
    html = urllib.urlopen(url) 
    soup = BeautifulSoup(html, "html.parser") 

    try: 
     url = soup.find_all('a')[2]["href"] 
     # if the link is not absolute, you might need `urljoin()` here 
    except IndexError: 
     break # could not get the 3rd link - exiting the loop 
+0

ありがとうございましたalecxe。上記のコードでは、 "tags = soup( 'a')はリストを返すので、" print "を実行するとリンクが多くなるので、" find_all "を使わずにすべてのリンクを与えているようです。ループが繰り返される3番目のリンクであると思われるタグ[2]を単に印刷するのはなぜですか? – martinbshp

+0

@martinbshpはい、 'soup()'は 'soup.find_all()'へのショートカットです。はい、答えに示されているように 'href'属性値を取得する必要があります。 – alecxe

+0

ああ、今すぐ取得しました。あなたの応答は私に戻ってこのことを再考し、タグがどのようにインデックスを調べる必要があるかを見ましたforループのタグvarではありません。 – martinbshp

0

別のオプションは、CSSが返すなし]を選択するまで、第三のアンカーループを取得するにはcss selectornth-of-typeを使用することです:

import urllib 
from bs4 import BeautifulSoup 

url = raw_input('Enter - ') 
html = urllib.urlopen(url) 
soup = BeautifulSoup(html, "html.parser") 
a = soup.select_one("a:nth-of-type(3)") 
while a: 
    html = urllib.urlopen(a["href"]) 
    soup = BeautifulSoup(html, "html.parser") 
    a = soup.select_one("a:nth-of-type(3)") 

あなたが探していました場合href属性を持つ3番目のアンカー"a:nth-of-type(3)[href]"

関連する問題