Tôi đã cố gắng sử dụng os.normpath
để chuyển đổi http://example.com/a/b/c/../
thành http://example.com/a/b/
nhưng nó không hoạt động trên Windows vì nó chuyển đổi dấu gạch chéo thành dấu gạch chéo ngược.Tôi làm cách nào để chuẩn hóa/thu gọn đường dẫn hoặc URL bằng Python theo cách độc lập của OS?
Trả lời
Sau đây là cách để làm điều đó
>>> import urlparse
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/", "../..")
'ftp://domain.com/a/b/'
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/e.txt", "../..")
'ftp://domain.com/a/b/'
Hãy nhớ rằng urljoin
xem xét một path/thư mục tất cả cho đến khi cuối cùng /
- sau này là tên file, nếu có.
Ngoài ra, không thêm hàng đầu /
vào tham số thứ hai, nếu không bạn sẽ không nhận được kết quả mong đợi.
os.path
mô-đun phụ thuộc vào nền tảng nhưng đối với đường dẫn tệp chỉ sử dụng dấu gạch chéo nhưng không phải URL bạn có thể sử dụng posixpath,normpath
.
được sử dụng từ mô-đun os "- os.path là một trong các mô-đun posixpath, hoặc ntpath", trong trường hợp của bạn rõ ràng sử dụng posixpath.
>>> import posixpath
>>> posixpath.normpath("https://stackoverflow.com/a/b/../c")
'/a/c'
>>>
'posixpath.normpath' thực hiện những điều vô ích như xóa dấu gạch chéo và cho phép dấu gạch chéo kép ban đầu. Cũng thay thế đường dẫn trống bằng '.'. –
Cả urljoin
cũng không posixpath.normpath
thực hiện công việc đúng. urljoin
buộc bạn phải tham gia với một thứ gì đó và không xử lý chính xác đường dẫn tuyệt đối hoặc quá nhiều ..
. posixpath.normpath
thu hẹp nhiều dấu gạch chéo và xóa dấu gạch chéo, cả hai đều là những thứ mà URL không nên thực hiện.
Chức năng sau đây giải quyết URL hoàn toàn, xử lý cả .
s và ..
s, trong một cách chính xác theo RFC 3986.
try:
# Python 3
from urllib.parse import urlsplit, urlunsplit
except ImportError:
# Python 2
from urlparse import urlsplit, urlunsplit
def resolve_url(url):
parts = list(urlsplit(url))
segments = parts[2].split('/')
segments = [segment + '/' for segment in segments[:-1]] + [segments[-1]]
resolved = []
for segment in segments:
if segment in ('../', '..'):
if resolved[1:]:
resolved.pop()
elif segment not in ('./', '.'):
resolved.append(segment)
parts[2] = ''.join(resolved)
return urlunsplit(parts)
Sau đó, bạn có thể gọi nó trên URL hoàn chỉnh như sau.
>>> resolve_url("http://example.com/dir/../../thing/.")
'http://example.com/thing/'
Để biết thêm thông tin về các cân nhắc phải được thực hiện khi giải quyết URL, hãy xem a similar answer I wrote earlier on the subject.
- 1. Tôi làm cách nào để rút ngắn URL bằng python?
- 2. Tôi làm cách nào để mã hóa url bằng Python?
- 3. Làm cách nào để tạo URL ngắn độc đáo bằng Python?
- 4. Tôi làm cách nào để sử dụng API rút gọn URL của Google trên Android?
- 5. Làm cách nào để có được đường dẫn của tập lệnh Python mà tôi đang chạy?
- 6. Làm cách nào để vẽ đường dẫn bằng bitmap?
- 7. Làm cách nào để truy vấn XDocument bằng 'đường dẫn'?
- 8. Làm cách nào để chuẩn hóa URL trong Java?
- 9. Làm cách nào để ghi đè đường dẫn của PHP để sử dụng đường dẫn MAMP?
- 10. Kiến trúc CPU Độc lập P/Gọi: DllName hoặc đường dẫn có thể là "động" không?
- 11. Làm cách nào để truy xuất đường dẫn đến dylib của tôi khi chạy?
- 12. Tôi làm cách nào để ký các JAR độc lập của ProGuard'ed Scala?
- 13. Làm cách nào để xóa tiền tố đường dẫn bằng Python?
- 14. Làm thế nào để có được/thiết lập đường dẫn thư mục hợp lý trong python
- 15. Tôi làm cách nào để giải mã URL bằng jQuery?
- 16. Cách lấy đường dẫn tệp tuyệt đối bằng Python
- 17. Làm cách nào để thiết lập đường dẫn tuyệt đối của thư viện Android trong ant.properties?
- 18. cách tạo Đường dẫn CSS bằng javascript hoặc jquery?
- 19. URL tham chiếu đường dẫn/URL tương đối của đường dẫn
- 20. Làm cách nào để tôi có thể lập cấu hình mã vạch python theo từng dòng?
- 21. "Đường dẫn chuẩn" là gì?
- 22. Tôi làm cách nào để rút gọn CSS bằng cách sử dụng `less` trong` express-js`?
- 23. Làm cách nào để chuyển đổi đường dẫn đầy đủ sang đường dẫn tương đối bằng cách sử dụng perl?
- 24. Đường dẫn tuyệt đối Asp.Net của URL
- 25. Làm cách nào để thêm .jar vào đường dẫn xây dựng của tôi trong Eclipse?
- 26. Làm cách nào để thực hiện từng bước một cách độc lập? (WinPDB)
- 27. Tôi làm cách nào để kiểm tra độ phân giải tuyến đường/hành động của URL bằng chuỗi truy vấn?
- 28. Làm cách nào để thay đổi đường dẫn ngữ cảnh của Dự án Doanh nghiệp của tôi
- 29. Làm cách nào để thử nghiệm theo chương trình nếu đường dẫn/tệp là lối tắt?
- 30. Làm thế nào để xác định đường dẫn & tên của thư viện được chia sẻ Python?
Ngược lại: Nếu tham số thứ hai có '/' hàng đầu, nó sẽ trả về 'ftp: //domain.com /../ ..'. Sửa chữa. –