Xử lý URL trong Python là quá trình phân tích, thao tác và truy xuất dữ liệu từ đường dẫn web. Điều này giúp bạn trích xuất thông tin, gửi request hoặc xây dựng URL một cách linh hoạt và chính xác. Trong bài viết này, mình sẽ hướng dẫn bạn cách làm việc với URL bằng thư viện urllib.parse
và urllib.request
, từ việc phân tích URL, gửi request đến xử lý lỗi phổ biến. Nếu bạn đang tìm kiếm giải pháp tối ưu khi thao tác với URL trong Python, bài viết này chắc chắn sẽ hữu ích.
Điểm chính cần nắm
- Quá trình xử lý URL trong Python như thế nào?: Giới thiệu tổng quan về cách làm việc với URL trong Python, bao gồm phân tích, tạo, gửi request và xử lý lỗi.
- Xử lý URL với urllib.parse: Sử dụng
urllib.parse
để phân tích, tách query string, ghép URL từ các thành phần. - Xử lý URL bằng urllib.request: Dùng
urllib.request
để đọc nội dung từ URL, gửi request GET/POST và thêm headers. - Sửa lỗi thường gặp khi làm việc với URL trong Python: Các lỗi phổ biến như
URLError
,HTTPError
khi làm việc với URL và cách xử lý. - Vietnix – Giải pháp lưu trữ tốc độ cao, bảo mật vững chắc: Giới thiệu về dịch vụ máy chủ của Vietnix, giúp tối ưu hiệu suất và bảo mật khi triển khai ứng dụng web.
- FAQ: Giải đáp các câu hỏi thường gặp khi xử lý URL trong Python.
Quá trình xử lý URL trong Python như thế nào?
Quá trình xử lý URL trong Python bao gồm việc phân tích, chỉnh sửa, truy xuất dữ liệu và quản lý lỗi liên quan đến URL. Python hỗ trợ xử lý URL thông qua thư viện urllib, bao gồm các module như urllib.parse
để phân tích URL, urllib.request
để gửi yêu cầu HTTP đến URL, urllib.error
để xử lý lỗi và urllib.robotparser
để làm việc với file robots.txt.
Trong môi trường Internet, các tài nguyên được xác định bằng URL (Uniform Resource Locators). Thư viện tiêu chuẩn của Python bao gồm gói urllib
, cung cấp các công cụ hỗ trợ phân tích URL, lấy nội dung web và quản lý lỗi.

Các module trong urllib hỗ trợ xử lý URL
Gói urllib
bao gồm các module chính sau:
urllib.parse
: Hỗ trợ phân tích URL thành các thành phần riêng lẻ.urllib.request
: Chứa các hàm để mở và đọc dữ liệu từ URL.urllib.error
: Xử lý các ngoại lệ được tạo ra bởiurllib.request
.urllib.robotparser
: Giúp phân tích filerobots.txt
.
Xử lý URL với urllib.parse
urllib.parse
là một module trong thư viện urllib
của Python, cung cấp các công cụ để phân tích, tạo và chỉnh sửa URL. Module này giúp tách URL thành các thành phần riêng biệt, chuyển đổi giữa các định dạng URL khác nhau và trích xuất dữ liệu từ query string.
Các hàm quan trọng trong urllib.parse
urlencode(query_dict)
– Mã hóa dictionary thành query string để sử dụng trong URL.urlparse(url)
– Phân tích URL thành sáu thành phần:scheme
,netloc
,path
,params
,query
vàfragment
.urlsplit(url)
– Tương tựurlparse()
, nhưng không táchparams
khỏipath
.urlunparse(parts)
– Kết hợp các thành phần của URL thành một chuỗi hoàn chỉnh.urlunsplit(parts)
– Kết hợp các thành phần URL theo cấu trúc củaurlsplit()
.parse_qs(query)
– Chuyển đổi query string thành dictionary chứa các tham số.
Phân tích, xử lý URL bằng urlparse(urlstring)
Hàm urlparse(urlstring)
trong module urllib.parse
được sử dụng để phân tích một URL thành các thành phần riêng biệt. Kết quả trả về là một named tuple gồm sáu phần:
Thuộc tính | Chỉ mục | Ý nghĩa |
---|---|---|
scheme | 0 | Giao thức của URL (HTTP, HTTPS, FTP,…) |
netloc | 1 | Tên miền hoặc địa chỉ IP và port (nếu có) |
path | 2 | Đường dẫn trên máy chủ |
params | 3 | Tham số của phần path |
query | 4 | Chuỗi truy vấn (query string) |
fragment | 5 | Phần định danh trong URL |
Ngoài ra, đối tượng trả về còn cung cấp các thuộc tính bổ sung như username
, password
, hostname
và port
.
Cú pháp:
from urllib.parse import urlparse
parsed_url = urlparse(urlstring)
Ví dụ:
from urllib.parse import urlparse
url = "https://vietnix.vn/employees/name/?salary>=25000"
parsed_url = urlparse(url)
print("Scheme:", parsed_url.scheme) # Output: https
print("Netloc:", parsed_url.netloc) # Output: vietnix.vn
print("Path:", parsed_url.path) # Output: /employees/name/
print("Params:", parsed_url.params) # Output: (rỗng)
print("Query string:", parsed_url.query) # Output: salary>=25000
print("Fragment:", parsed_url.fragment) # Output: (rỗng)
Giải thích
- scheme: Giao thức của URL (ví dụ:
http
,https
,ftp
…) - netloc: Tên miền hoặc địa chỉ máy chủ
- path: Đường dẫn trên máy chủ
- params: Tham số của phần path
- query: Chuỗi truy vấn, thường chứa các tham số trong URL
- fragment: Phần neo, thường được dùng để di chuyển đến một vị trí cụ thể trên trang web
Kết quả:
Scheme: https
Netloc: vietnix.vn
Path: /employees/name/
Params:
Query string: salary>=25000
Fragment:
Tách query string với parse_qs(qs)
Hàm parse_qs(qs)
trong module urllib.parse
được sử dụng để phân tích query string trong URL và chuyển đổi nó thành một dictionary. Mỗi tham số trong query string sẽ trở thành một key trong dictionary, còn giá trị tương ứng sẽ được lưu dưới dạng danh sách.
Cú pháp:
from urllib.parse import parse_qs
parsed_query = parse_qs(qs)
Ví dụ:
from urllib.parse import urlparse, parse_qs
url = "https://vietnix.vn/search?category=server&price=1000&price=2000"
parsed_url = urlparse(url)
query_string = parsed_url.query
parsed_query = parse_qs(query_string)
print("Query String:", query_string)
print("Parsed Query:", parsed_query)
Giải thích
query_string
: Chứa toàn bộ phần query string của URL.parse_qs(query_string)
: Chuyển đổi query string thành dictionary, trong đó:- Key là tên tham số trong query string.
- Value là danh sách chứa giá trị của tham số đó.
Kết quả:
Query String: category=server&price=1000&price=2000
Parsed Query: {‘category’: [‘server’], ‘price’: [‘1000’, ‘2000’]}
Ở ví dụ trên, tham số price
xuất hiện hai lần trong query string, nên parse_qs()
sẽ lưu giá trị của nó dưới dạng danh sách ['1000', '2000']
. Nếu một tham số chỉ xuất hiện một lần, danh sách chỉ chứa một phần tử.
Ghép URL từ các thành phần với urlunparse()
và urlunsplit()
Trong module urllib.parse
, hai hàm urlunparse()
và urlunsplit()
giúp kết hợp các thành phần URL thành một chuỗi hoàn chỉnh.
urlunparse(parts)
: Ghép 6 thành phần của URL (scheme
,netloc
,path
,params
,query
,fragment
) thành một URL đầy đủ.urlunsplit(parts)
: Tương tựurlunparse()
, nhưng chỉ ghép 5 thành phần (scheme
,netloc
,path
,query
,fragment
), bỏ quaparams
.
Cú pháp:
from urllib.parse import urlunparse, urlunsplit
urlunparse(parts)
Hàm này là đối nghịch của hàm urlparse()
, tạo một URL từ một bộ dữ liệu (tuple) được trả về bởi urlparse()
. Đối số parts
có thể là bất kỳ bộ dữ liệu sáu phần tử nào. Hàm này trả về một URL tương đương.
Ví dụ sử dụng urlunparse()
:
from urllib.parse import urlunparse
parts = ("https", "vietnix.vn", "/search", "", "category=server&price=1000", "")
url = urlunparse(parts)
print("URL:", url)
Kết quả:
URL: https://vietnix.vn/search?category=server&price=1000
Giải thích
scheme
:"https"
netloc
:"vietnix.vn"
path
:"/search"
params
:""
(Không có tham sốparams
)query
:"category=server&price=1000"
fragment
:""
(Không có phần định danh)
urlunsplit(parts)
Kết hợp các thành phần của một bộ dữ liệu như được trả về bởi urlsplit()
thành một URL đầy đủ dưới dạng chuỗi. Đối số parts
có thể là bất kỳ bộ dữ liệu năm phần tử nào.
Ví dụ sử dụng urlunsplit()
:
from urllib.parse import urlunsplit
parts = ("https", "vietnix.vn", "/search", "category=server&price=1000", "")
url = urlunsplit(parts)
print("URL:", url)
Kết quả:
URL: https://vietnix.vn/search?category=server&price=1000
urlsplit(urlstring)
Tương tự như urlparse()
, nhưng không tách các tham số khỏi URL. Điều này nên được sử dụng thay cho urlparse()
nếu muốn áp dụng cú pháp URL mới cho phép áp dụng các tham số được áp dụng cho từng đoạn đường dẫn của URL.
Ví dụ:
from urllib.parse import urlsplit
url = "https://example.com/employees/name;param1=value1?salary=25000#section"
parsed_url = urlsplit(url)
print("Scheme:", parsed_url.scheme)
print("Netloc:", parsed_url.netloc)
print("Path:", parsed_url.path)
print("Query:", parsed_url.query)
print("Fragment:", parsed_url.fragment)
Kết quả:
Scheme: https
Netloc: example.com
Path: /employees/name;param1=value1
Query: salary=25000
Fragment: section
Xử lý URL bằng urllib.request
Module urllib.request
trong Python cung cấp các phương thức để gửi yêu cầu HTTP và lấy dữ liệu từ URL. Hỗ trợ tải nội dung từ web, xử lý phản hồi HTTP và gửi yêu cầu có kèm headers tùy chỉnh.
Đọc nội dung từ URL với urlopen()
Hàm urlopen()
mở URL được cung cấp, có thể là một chuỗi hoặc một đối tượng Request
. Tham số tùy chọn timeout
xác định thời gian chờ đợi tính bằng giây cho các hoạt động chặn. Hàm này hoạt động với các kết nối HTTP, HTTPS và FTP.
Hàm luôn trả về một đối tượng có thể hoạt động như một trình quản lý ngữ cảnh và có các thuộc tính url
, headers
, và status
. Đối với các URL HTTP và HTTPS, kết quả trả về là một đối tượng http.client.HTTPResponse
.
Ví dụ:
Mã dưới đây sử dụng hàm urlopen()
để đọc dữ liệu nhị phân từ một file hình ảnh và ghi nó vào file . Bạn có thể mở file hình ảnh trên máy tính của mình bằng bất kỳ trình xem hình ảnh nào.
from urllib.request import urlopen
obj = urlopen("https://vietnix.vn/wp-content/uploads/2024/08/img.png")
data = obj.read()
with open("img.jpg", "wb") as img:
img.write(data)
Kết quả:

Gửi request với Request()
Module urllib.request
bao gồm lớp Request
, một trừu tượng hóa của một yêu cầu URL. Hàm tạo nhận một chuỗi đối số bắt buộc là một URL hợp lệ.
Cú pháp:
urllib.request.Request(url, data, headers, origin_req_host, method=None)
Đối số:
- url: Một chuỗi đại diện cho URL hợp lệ.
- data: Một đối tượng chỉ định dữ liệu bổ sung để gửi tới máy chủ. Tham số này chỉ có thể được sử dụng với các yêu cầu HTTP. Dữ liệu có thể là bytes, đối tượng giống file, và các đối tượng lặp lại của các đối tượng giống kiểu bytes.
- headers: Nên là một từ điển chứa các header và các giá trị tương ứng của chúng.
- origin_req_host: Nên là máy chủ yêu cầu của giao dịch gốc.
- method: Nên là một chuỗi chỉ ra phương thức HTTP của yêu cầu. Có thể là GET, POST, PUT, DELETE và các động từ HTTP khác. Mặc định là GET.
Ví dụ:
from urllib.request import Request
obj = Request("https://vietnix.vn/")
Đối tượng Request
này bây giờ có thể được sử dụng làm đối số cho phương thức urlopen()
.
from urllib.request import Request, urlopen
obj = Request("https://vietnix.vn/")
resp = urlopen(obj)
Hàm urlopen() trả về một đối tượng HttpResponse. Gọi phương thức read() của nó sẽ lấy tài nguyên tại URL đã cho.
from urllib.request import Request, urlopen
obj = Request("https://vietnix.vn/")
resp = urlopen(obj)
data = resp.read()
print (data)
Gửi dữ liệu qua POST request
Nếu data
được truyền vào Request
, một yêu cầu POST
sẽ được gửi đến máy chủ. Dữ liệu phải được mã hóa thành bytes
.
from urllib.request import Request, urlopen
from urllib.parse import urlencode
values = {
"name": "Bo",
"location": "Vietnam",
"language": "Vietnamese"
}
data = urlencode(values).encode("utf-8")
obj = Request("https://vietnix.vn", data=data)
resp = urlopen(obj)
Thêm headers vào request
Hàm tạo của Request
cũng chấp nhận đối số headers
để đẩy thông tin header vào yêu cầu. Đối số này nên là một đối tượng dictionary.
headers = {"User-Agent": "Mozilla/5.0"}
obj = Request("https://vietnix.vn", data=data, headers=headers)
Sửa lỗi thường gặp khi làm việc với URL trong Python
Làm việc với URL trong Python có thể gặp một số lỗi phổ biến, đặc biệt khi sử dụng các module như urllib.parse
và urllib.request
. Dưới đây là các lỗi thường gặp và cách khắc phục.
URLError – Không thể kết nối đến server
URLError được tạo ra khi không có kết nối mạng (không có lộ trình đến máy chủ được chỉ định), hoặc máy chủ được chỉ định không tồn tại. Trong trường hợp này, ngoại lệ sẽ có thuộc tính ‘reason’.
Ví dụ
from urllib.request import Request, urlopen
import urllib.error as err
url = "https://vietnix.vn/khong-ton-tai"
try:
response = urlopen(Request(url))
except err.URLError as e:
print("Không thể kết nối đến Vietnix:", e.reason)
Kết quả:
Không thể kết nối đến Vietnix: [Errno 11001] getaddrinfo failed
Cách khắc phục:
- Kiểm tra kết nối mạng trước khi gửi request.
- Đảm bảo URL hợp lệ.
- Bọc request trong
try-except
để tránh chương trình bị gián đoạn.
HTTPError – Lỗi HTTP phổ biến như 404, 403
Mỗi khi máy chủ gửi một phản hồi HTTP, nó kèm theo một mã trạng thái số. Mã này chỉ ra lý do máy chủ không thể đáp ứng yêu cầu. Mã này cho biết lý do tại sao máy chủ không thể thực hiện yêu cầu. Các trình xử lý mặc định sẽ xử lý một số phản hồi này cho bạn. Đối với những phản hồi mà nó không thể xử lý, hàm urlopen() sẽ đưa ra HTTPError. Ví dụ về HTTPError là ‘404 – Not found‘ (trang không tìm thấy), ‘403‘ (yêu cầu bị cấm), và ‘401‘ (yêu cầu xác thực).
Ví dụ:
from urllib.request import Request, urlopen
import urllib.error as err
url = "https://vietnix.vn/server-bi-khoa"
try:
response = urlopen(Request(url))
except err.HTTPError as e:
print(f"Lỗi HTTP {e.code}: {e.reason}")
Kết quả:
Lỗi HTTP 404: Not Found
Cách khắc phục:
- Kiểm tra URL có chính xác không.
- Nếu gặp lỗi 403, thử thêm
User-Agent
vào header để tránh bị chặn request tự động.
Vietnix – Giải pháp lưu trữ tốc độ cao, bảo mật vững chắc
Vietnix là đơn vị hàng đầu trong lĩnh vực cho thuê máy chủ (server), hosting, VPS, domain tại Việt Nam. Với cam kết cung cấp dịch vụ ổn định, bảo mật cao cùng đội ngũ hỗ trợ 24/7, Vietnix đã được hơn 80.000 khách hàng tin tưởng lựa chọn. Dịch vụ của Vietnix giúp doanh nghiệp tối ưu hiệu suất, bảo vệ dữ liệu và vận hành hiệu quả.
Thông tin liên hệ:
- Website: https://vietnix.vn/
- Hotline: 18001093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, TP. Hồ Chí Minh.
Câu hỏi thường gặp
Làm thế nào để phân tích một URL thành các phần nhỏ bằng Python?
Bạn có thể sử dụng urllib.parse.urlparse()
để phân tích một URL thành các thành phần như scheme, netloc, path, params, query, và fragment. Ví dụ:
from urllib.parse import urlparse url = "https://example.com/path?name=value#section" parsed_url = urlparse(url) print(parsed_url.scheme) # https print(parsed_url.netloc) # example.com print(parsed_url.path) # /path print(parsed_url.query) # name=value print(parsed_url.fragment) # section
Cách lấy query string từ URL và chuyển thành dictionary?
Dùng urllib.parse.parse_qs()
để tách query string thành một dictionary:
from urllib.parse import urlparse, parse_qs url = "https://example.com/path?name=John&age=30" query_params = parse_qs(urlparse(url).query) print(query_params) # {'name': ['John'], 'age': ['30']}
Làm sao để gửi request HTTP bằng urllib.request?
Sử dụng urllib.request.urlopen()
để gửi request đến một URL và lấy nội dung phản hồi:
from urllib.request import urlopen url = "https://www.example.com" response = urlopen(url) content = response.read().decode() print(content)
Làm thế nào để xử lý lỗi HTTPError và URLError khi mở URL?
Dùng try-except
để bắt lỗi:
from urllib.request import urlopen from urllib.error import URLError, HTTPError url = "https://www.nonexistentwebsite.com" try: response = urlopen(url) except HTTPError as e: print(f"Lỗi HTTP: {e.code} - {e.reason}") except URLError as e: print(f"Lỗi URL: {e.reason}")
Có nên sử dụng urllib để scrape dữ liệu từ web không?
urllib
có thể dùng để lấy HTML từ trang web nhưng không hỗ trợ parsing mạnh mẽ như BeautifulSoup
hoặc Scrapy
.
urllib có hỗ trợ xử lý URL động không?
urllib.parse
hỗ trợ xây dựng URL động từ các tham số, nhưng không hỗ trợ xử lý AJAX hay các trang web động như Selenium.
Lời kết
Việc thao tác với URL trong Python trở nên đơn giản hơn rất nhiều nhờ các module tích hợp sẵn như urllib.parse
và urllib.request
. Hiểu rõ cách sử dụng những công cụ này không chỉ giúp bạn xử lý URL hiệu quả mà còn tối ưu hóa các tác vụ liên quan đến mạng và web scraping. Nếu bạn có bất cứ thắc mắc hay cần hỗ trợ gì, hãy để lại bình luận bên dưới mình hỗ trợ nhanh nhất. Cảm ơn bạn đã đọc!