2

HTMLを解析してそこから画像を取得するアプリを作成しています。Beautiful Soupとhtmlのダウンロードを使用すると解析が簡単で、画像はurllib2でも機能します。

相対パスから絶対パスを作成するためのurlparseに問題があります。問題は例で最もよく説明されます:

>>> import urlparse
>>> urlparse.urljoin("http://www.example.com/", "../test.png")
'http://www.example.com/../test.png'

ご覧のとおり、urlparseは../を削除しません。これにより、画像をダウンロードしようとすると問題が発生します。

HTTPError: HTTP Error 400: Bad Request

urllibでこの問題を修正する方法はありますか?

4

4 に答える 4

3

".." は 1 つのディレクトリ ("." は現在のディレクトリ) を表示するため、それをドメイン名の URL と組み合わせてもあまり意味がありません。多分あなたが必要とするのは:

>>> urlparse.urljoin("http://www.example.com","./test.png")
'http://www.example.com/test.png'
于 2010-11-06T17:30:10.760 に答える
2

あなたができる最善のことは、元の URL を事前に解析し、パス コンポーネントを確認することだと思います。簡単なテストは

if len(urlparse.urlparse(baseurl).path) > 1:

次に、demas によって提案された索引付けと組み合わせることができます。例えば:

start_offset = (len(urlparse.urlparse(baseurl).path) <= 1) and 2 or 0
img_url = urlparse.urljoin("http://www.example.com/", "../test.png"[start_offset:])

これにより、ルート URL の親に移動しようとしなくなります。

于 2010-11-06T17:48:37.400 に答える
1

/../testファイルシステムの同様のパスと同じ意味にしたい場合は/test、次を使用できますnormpath()

>>> url = urlparse.urljoin("http://example.com/", "../test")
>>> p = urlparse.urlparse(url)
>>> path = posixpath.normpath(p.path)
>>> urlparse.urlunparse((p.scheme, p.netloc, path, p.params, p.query,p.fragment))
'http://example.com/test'
于 2010-11-07T19:50:10.837 に答える
0
urlparse.urljoin("http://www.example.com/", "../test.png"[2:])

それはあなたが必要とするものですか?

于 2010-11-06T17:31:30.767 に答える