2017-05-03 9 views
0

私のコードをページのURLを返します。BeautifulSoupは、参考のために、同じウェブサイトに短縮

import httplib2 
from bs4 import BeautifulSoup 

h = httplib2.Http('.cache') 
response, content = h.request('http://csb.stanford.edu/class/public/pages/sykes_webdesign/05_simple.html') 
soup = BeautifulSoup(content, "lxml") 
urls = [] 
for tag in soup.findAll('a', href=True): 
    urls.append(tag['href']) 
responses = [] 
contents = [] 
for url in urls: 
    try: 
     response1, content1 = h.request(url) 
     responses.append(response1) 
     contents.append(content1) 
    except: 
     pass 

アイデアがある、私は、Webページのペイロードを取得した後、ハイパーリンクのためにすることをこすり。スクリプトの後半ので、

>>> urls 
['http://www.yahoo.com/', '../../index.html'] 

これは、問題を提示:リンクの一つは、私はBeautifulSoupから取得していた結果があるしかし「http://csb.stanford.edu/class/public/index.html

に他、yahoo.comにあります短縮された2番目のURLでは実行できません。 BeautifulSoupに完全なURLを取得させる方法はありますか?

答えて

1

ウェブページのリンクが実際にそのフォームになっているからです。ページのHTMLは次のようになります。これは、相対リンクと呼ばれる

<p>Or let's just link to <a href=../../index.html>another page on this server</a></p>

これを絶対リンクに変換するには、標準ライブラリのurljoinを使用します。

from urllib.parse import urljoin # Python3 

urljoin('http://csb.stanford.edu/class/public/pages/sykes_webdesign/05_simple.html`, 
     '../../index.html') 
# returns http://csb.stanford.edu/class/public/index.html 
+0

もちろん、ありがとうございます。例外にurl join部分を含めることができます。 –

+0

さらに考えてみると、私は気にしないでしょう、それは単一のウェブページにしか特定できず、実際には気にする価値がありません –

関連する問題