Tôi đang cố gắng xác định cơ sở của URL, hoặc mọi thứ ngoài trang và tham số. Tôi đã thử sử dụng Split, nhưng có cách nào tốt hơn là chia nó thành từng mảnh không? Có cách nào tôi có thể loại bỏ mọi thứ từ lần cuối '/' không?
Cho điều này: //127.0.0.1/asdf/login.php
Tôi muốn: //127.0.0.1/asdf/
hỏi ngày 25 tháng 2 năm 2016 lúc 1:13Feb 25, 2016 at 1:13
6
Cách tốt nhất để làm điều này là sử dụng
>>> os.path.dirname['//127.0.0.1/asdf/login.php']
'//127.0.0.1/asdf'
2.Từ các tài liệu:
Mô -đun đã được thiết kế để phù hợp với RFC Internet trên các bộ định vị tài nguyên đồng nhất tương đối. Nó hỗ trợ các sơ đồ url sau:
3,>>> os.path.dirname['//127.0.0.1/asdf/login.php'] '//127.0.0.1/asdf'
4,>>> os.path.dirname['//127.0.0.1/asdf/login.php'] '//127.0.0.1/asdf'
5,>>> os.path.dirname['//127.0.0.1/asdf/login.php'] '//127.0.0.1/asdf'
6, ____17 ,>>> os.path.dirname['//127.0.0.1/asdf/login.php'] '//127.0.0.1/asdf'
5,from urllib.parse import urljoin base_url = urljoin['//127.0.0.1/asdf/login.php', '.'] # output: //127.0.0.1/asdf/
6,from urllib.parse import urljoin base_url = urljoin['//127.0.0.1/asdf/login.php', '.'] # output: //127.0.0.1/asdf/
7,from urllib.parse import urljoin base_url = urljoin['//127.0.0.1/asdf/login.php', '.'] # output: //127.0.0.1/asdf/
8.from urllib.parse import urljoin base_url = urljoin['//127.0.0.1/asdf/login.php', '.'] # output: //127.0.0.1/asdf/
Bạn muốn làm điều gì đó như thế này bằng cách sử dụng URLSplit và UrlunSplit:
from urllib.parse import urlsplit, urlunsplit
split_url = urlsplit['//127.0.0.1/asdf/login.php?q=abc#stackoverflow']
# You now have:
# split_url.scheme "http"
# split_url.netloc "127.0.0.1"
# split_url.path "/asdf/login.php"
# split_url.query "q=abc"
# split_url.fragment "stackoverflow"
# Use all the path except everything after the last '/'
clean_path = "".join[split_url.path.rpartition["/"][:-1]]
# "/asdf/"
# urlunsplit joins a urlsplit tuple
clean_url = urlunsplit[split_url]
# "//127.0.0.1/asdf/login.php?q=abc#stackoverflow"
# A more advanced example
advanced_split_url = urlsplit['//foo::5000/asdf/login.php?q=abc#stackoverflow']
# You now have *in addition* to the above:
# advanced_split_url.username "foo"
# advanced_split_url.password "bar"
# advanced_split_url.hostname "127.0.0.1"
# advanced_split_url.port "5000"
Đã trả lời ngày 25 tháng 2 năm 2016 lúc 1:27Feb 25, 2016 at 1:27
Dalanmillerdalanmillerdalanmiller
3.3474 Huy hiệu vàng29 Huy hiệu bạc37 Huy hiệu đồng4 gold badges29 silver badges37 bronze badges
3
Vâng, đối với một, bạn chỉ có thể sử dụng
from urllib.parse import urljoin
base_url = urljoin['//127.0.0.1/asdf/login.php', '.']
# output: //127.0.0.1/asdf/
9:>>> os.path.dirname['//127.0.0.1/asdf/login.php']
'//127.0.0.1/asdf'
Nó không rõ ràng cho các URL, nhưng nó xảy ra với chúng [ngay cả trên Windows], nó không để lại dấu vết dấu vết [bạn có thể tự thêm nó trở lại].
Bạn cũng có thể muốn xem
base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
0 để phân tích phân tích hạt mịn hơn; Nếu URL có chuỗi truy vấn hoặc băm liên quan, bạn muốn phân tích thành từng mảnh, cắt phần base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
1 được trả về bằng cách phân tích cú pháp, sau đó tái tổ hợp, do đó đường dẫn được cắt mà không mất thông tin truy vấn và băm.Cuối cùng, nếu bạn muốn tách thành phần sau lần cắt cuối cùng, bạn có thể thực hiện
base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
2 với base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
3 của base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
4 và giữ thành phần đầu tiên: >>> '//127.0.0.1/asdf/login.php'.rsplit['/', 1][0]
'//127.0.0.1/asdf'
Đã trả lời ngày 25 tháng 2 năm 2016 lúc 1:18Feb 25, 2016 at 1:18
ShadowrangershadowrangerShadowRanger
133K12 Huy hiệu vàng172 Huy hiệu bạc247 Huy hiệu Đồng12 gold badges172 silver badges247 bronze badges
4
Có giải pháp ngắn nhất cho Python3 với việc sử dụng thư viện Urllib [không biết nếu nhanh nhất]:
from urllib.parse import urljoin
base_url = urljoin['//127.0.0.1/asdf/login.php', '.']
# output: //127.0.0.1/asdf/
Hãy nhớ rằng thư viện Urllib hỗ trợ tương thích URI/URL với từ khóa của HTML. Điều đó có nghĩa là URI/URL kết thúc với '/' có nghĩa là khác nhau mà không giống như ở đây //stackoverflow.com/a/1793282/7750840/:
base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
Đây là liên kết đến Urllib cho Python: //pythonprogramming.net/urllib-tutorial-python-3/
Đã trả lời ngày 12 tháng 7 năm 2019 lúc 12:37Jul 12, 2019 at 12:37
Bukasbukasbukas
1512 Huy hiệu bạc2 Huy hiệu đồng2 silver badges2 bronze badges
Đồng ý rằng cách tốt nhất để làm điều đó là với
>>> os.path.dirname['//127.0.0.1/asdf/login.php']
'//127.0.0.1/asdf'
2Cụ thể, bạn có thể phân tách URL bằng
base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
0 và sau đó thay thế mọi thuộc tính khác ngoài base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
7 và base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
8 bằng một chuỗi trống. Nếu bạn muốn giữ thuộc tính base_url = urljoin['//127.0.0.1/asdf/', '.']
# output: //127.0.0.1/asdf/
base_url = urljoin['//127.0.0.1/asdf', '.']
# output: //127.0.0.1/
1 [như trong câu hỏi của bạn], bạn có thể làm như vậy với một bước phân tích cú pháp chuỗi bổ sung. Chức năng ví dụ dưới đây:import urllib.parse
def base_url[url, with_path=False]:
parsed = urllib.parse.urlparse[url]
path = '/'.join[parsed.path.split['/'][:-1]] if with_path else ''
parsed = parsed._replace[path=path]
parsed = parsed._replace[params='']
parsed = parsed._replace[query='']
parsed = parsed._replace[fragment='']
return parsed.geturl[]
Examples:
>>> base_url['//127.0.0.1/asdf/login.php', with_path=True]
'//127.0.0.1/asdf'
>>> base_url['//127.0.0.1/asdf/login.php']
'//127.0.0.1'
Đã trả lời ngày 31 tháng 12 năm 2019 lúc 17:51Dec 31, 2019 at 17:51
Rodmsrodmsrodms
3513 Huy hiệu bạc12 Huy hiệu Đồng3 silver badges12 bronze badges
Không cần sử dụng Regex, bạn chỉ có thể sử dụng
import urllib.parse
def base_url[url, with_path=False]:
parsed = urllib.parse.urlparse[url]
path = '/'.join[parsed.path.split['/'][:-1]] if with_path else ''
parsed = parsed._replace[path=path]
parsed = parsed._replace[params='']
parsed = parsed._replace[query='']
parsed = parsed._replace[fragment='']
return parsed.geturl[]
0:>>> url = '//127.0.0.1/asdf/login.php'
>>> url.rsplit['/', 1][0]
'//127.0.0.1/asdf'
Đã trả lời ngày 25 tháng 2 năm 2016 lúc 1:19Feb 25, 2016 at 1:19
pp_pp_pp_
3.3874 Huy hiệu vàng18 Huy hiệu bạc27 Huy hiệu đồng4 gold badges18 silver badges27 bronze badges
Khi bạn sử dụng URLSplit, nó sẽ trả về một đối tượng Splitresult:
from urllib.parse import urlsplit
split_url = urlsplit['//127.0.0.1/asdf/login.php']
print[split_url]
>>> SplitResult[scheme='http' netloc='127.0.0.1' path='/asdf/login.php' query='' fragment='']
Bạn có thể tạo đối tượng splitresult [] của riêng bạn và chuyển nó qua UrlunSplit. Mã này sẽ hoạt động cho nhiều phân tách URL, bất kể độ dài của chúng, miễn là bạn biết phần tử đường dẫn cuối cùng bạn muốn là gì.
from urllib.parse import urlsplit, urlunsplit, SplitResult
# splitting url:
split_url = urlsplit['//127.0.0.1/asdf/login.php']
# editing the variables you want to change [in this case, path]:
last_element = 'asdf' # this can be any element in the path.
path_array = split_url.path.split['/']
# print[path_array]
# >>> ['', 'asdf', 'login.php']
path_array.remove['']
ind = path_array.index[last_element]
new_path = '/' + '/'.join[path_array[:ind+1]] + '/'
# making SplitResult[] object with edited data:
new_url = SplitResult[scheme=split_url.scheme, netloc=split_url.netloc, path=new_path, query='', fragment='']
# unsplitting:
base_url = urlunsplit[new_url]
Đã trả lời ngày 24 tháng 11 năm 2019 lúc 2:05Nov 24, 2019 at 2:05
Có được sự xuất hiện đúng nhất của chém; Sử dụng lát chuỗi thông qua vị trí đó trong chuỗi ban đầu. +1 giúp bạn chém cuối cùng vào cuối.+1 gets you that final slash at the end.
>>> os.path.dirname['//127.0.0.1/asdf/login.php']
'//127.0.0.1/asdf'
0
Đã trả lời ngày 25 tháng 2 năm 2016 lúc 1:19Feb 25, 2016 at 1:19
3.3874 Huy hiệu vàng18 Huy hiệu bạc27 Huy hiệu đồngPrune
Khi bạn sử dụng URLSplit, nó sẽ trả về một đối tượng Splitresult:14 gold badges57 silver badges76 bronze badges
1
Bạn có thể tạo đối tượng splitresult [] của riêng bạn và chuyển nó qua UrlunSplit. Mã này sẽ hoạt động cho nhiều phân tách URL, bất kể độ dài của chúng, miễn là bạn biết phần tử đường dẫn cuối cùng bạn muốn là gì.
>>> os.path.dirname['//127.0.0.1/asdf/login.php']
'//127.0.0.1/asdf'
1Đã trả lời ngày 24 tháng 11 năm 2019 lúc 2:05Aug 31, 2018 at 7:49
bzd111bzd111bzd111
Có được sự xuất hiện đúng nhất của chém; Sử dụng lát chuỗi thông qua vị trí đó trong chuỗi ban đầu. +1 giúp bạn chém cuối cùng vào cuối.3 silver badges5 bronze badges