2017-08-27 7 views
0

私はBeautifulSoupを使って簡単なWebScraperを構築することになっているオンラインクラスの問題に取り組んでいます。特定のアンカータグを呼び出して、Python WebscraperのURLに戻すにはどうすればいいですか?

ここに私の進捗状況は、これまでのところです:

import urllib.request, urllib.parse, urllib.error 
from bs4 import BeautifulSoup 
import ssl 

count = int(4) 
position = int(3) 

ctx = ssl.create_default_context() 
ctx.check_hostname = False 
ctx.verify_mode = ssl.CERT_NONE 

url = 'http://py4e-data.dr-chuck.net/known_by_Fikret.html' 

html = urllib.request.urlopen(url, context=ctx).read() 
soup = BeautifulSoup(html, "html.parser") 
tags = soup('a', None) 
for tag in tags: 
    print(tag.get('href', None)) 

私の質問はこれです:私は、タグ内のタグのリストから特定のアンカータグを抽出するにはどうすればよいですか?また、どのようにしてforループを4回だけ繰り返すことができますか?

割り当ての詳細:

assignment details

更新:

import urllib.request, urllib.parse, urllib.error 
from bs4 import BeautifulSoup 
import ssl 

position = int(3) 
count = int(4) 

ctx = ssl.create_default_context() 
ctx.check_hostname = False 
ctx.verify_mode = ssl.CERT_NONE 

url = input('Enter - ') 

for i in range(count): 
    html = urllib.request.urlopen(url, context=ctx).read() 
    soup = BeautifulSoup(html, 'html.parser') 
    tags = soup('a') 
    print(tags[position]) 

だから私は位置でこのようにタグを呼び出すことができますが、私は位置にタグを反復処理する方法を知っておく必要があります。今の私のプログラムは、3回目のリンクを4回印刷します。

+0

Welcome to StackOverflow! StackOverflowの宿題に関する質問は禁止されていませんが、あなたの質問へのより良い回答に役立つよう、**問題**をテキスト**に含めることをお勧めします。 –

+0

a)リストインデックスを使用してください。たとえば、 'tags [2]' b) 'range'を使用してください。例えば:for i in range(4): –

+0

範囲機能を完全に忘れました。ありがとうございました! –

答えて

0

すでにご存知のように、tags = soup('a')ではかなり長いリンクが作成されています。

リンクの検索方法を指定していません。私はあなたが名前で選択していると仮定します。次に、モンゴメリを検索する方法です。

>>> soup.find_all(string='Montgomery') 
['Montgomery'] 

あなたは、このように」Montgomery`が含まれています(「A」)要素リンクを得ることができることを持ったら:

>>> soup.find_all(string='Montgomery')[0].findParent() 
<a href="http://py4e-data.dr-chuck.net/known_by_Montgomery.html">Montgomery</a> 

は、その後、あなたがリンク要素の属性を取得することができますこれはMontgomeryの実際のURLです。ほとんどの4倍でループを通って行くの

>>> soup.find_all(string='Montgomery')[0].findParent().attrs['href'] 
'http://py4e-data.dr-chuck.net/known_by_Montgomery.html' 

一つの方法:

count = 0 
for tag in tags: 
    <do something> 
    count += 1 
    if count >= 4: 
     break 
+0

返信をありがとう!この割り当てのためには、タグオブジェクト内の位置によってリンクを選択する必要があります。したがって、3番目のリンクがダウンしている場合は、3番目のリンクを指定した回数だけ繰り返してループに伝える必要があります。のように、 "第3のリンクを4回クリックする"。 –

1

がそれを手に入れました!

import urllib.request, urllib.parse, urllib.error 
from bs4 import BeautifulSoup 
import ssl 

position = int(17) 
count = int(7) 

ctx = ssl.create_default_context() 
ctx.check_hostname = False 
ctx.verify_mode = ssl.CERT_NONE 

url = input('Enter - ') 

for i in range(count): 
    html = urllib.request.urlopen(url, context=ctx).read() 
    soup = BeautifulSoup(html, 'html.parser') 
    url = soup('a')[position].get('href', None) 
    print(url) 
関連する問題