Ngân hàng câu hỏi của chương

Câu hỏi: PRP201c - Phần 3: Thu thập và trao đổi dữ liệu web

43 câu trắc nghiệm kèm lời giải của môn PRP201c - Lập trình Python, xếp theo thứ tự nhập vào ngân hàng. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/43 câuCòn 3
Aurllib
Bos
Clibrary
Dlib
Lời giải
Đáp án đúng: "urllib". Gói chuẩn urllib của Python có mô-đun urllib.request với hàm urlopen() mở một URL và trả về một đối tượng giống tệp, đọc được bằng read() hoặc lặp qua từng dòng như tệp thường, ví dụ fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt'). Gói này đi kèm Python, không cần cài thêm. Phương án "os" là mô-đun làm việc với hệ điều hành như đường dẫn, thư mục, biến môi trường, không mở trang web. Phương án "library" chỉ là từ chung nghĩa là thư viện, không phải tên mô-đun nào của Python. Phương án "lib" cũng không phải mô-đun chuẩn để đọc web; đó chỉ là tên viết tắt thường gặp của thư mục chứa thư viện. Ngoài urllib, người ta còn hay dùng gói requests cài thêm qua pip.
Mở trang câu hỏi này →
AThe "+" matches upper case characters and the "*" matches lowercase characters
BThe "+" matches the beginning of a line and the "*" matches the end of a line
CThe "+" matches the actual plus character and the "*" matches any character
DThe "+" matches at least one character and the "*" matches zero or more characters
Lời giải
Đáp án đúng: "The "+" matches at least one character and the "*" matches zero or more characters". Trong regular expression, + và * là lượng từ (quantifier) áp lên ký tự hoặc nhóm đứng ngay trước: + đòi ký tự đó xuất hiện từ một lần trở lên, * cho phép từ không lần trở lên, tức có thể vắng mặt. Ví dụ \S+@\S+ cần ít nhất một ký tự không phải khoảng trắng ở hai bên @, còn ab*c khớp cả ac lẫn abbbc. "The "+" matches upper case characters and the "*" matches lowercase characters" sai vì chữ hoa và chữ thường được khớp bằng lớp ký tự trong ngoặc vuông như [a-z]. "The "+" matches the beginning of a line and the "*" matches the end of a line" nhầm với hai ký tự neo ^ cho đầu dòng và $ cho cuối dòng. "The "+" matches the actual plus character and the "*" matches any character" sai cả hai vế: muốn khớp dấu cộng thật phải thoát thành \+, còn ký tự đại diện cho một ký tự bất kỳ là dấu chấm.
Mở trang câu hỏi này →
Đề bài
y = re.findall('^F.+:', x)
print(y)
A^F.+:
B['From: Using the :']
C['From:']
DFrom:
Lời giải
Đáp án đúng: "['From: Using the :']". Mẫu ^F.+: nghĩa là bắt đầu đầu chuỗi bằng chữ F, tiếp theo một hoặc nhiều ký tự bất kỳ, kết thúc bằng dấu hai chấm; vì .+ là tham lam (greedy) nên nó khớp dài nhất có thể, kéo tới dấu hai chấm cuối cùng trong chuỗi, cho đoạn From: Using the :. re.findall trả về một danh sách các đoạn khớp, nên print in ra danh sách một phần tử. "['From:']" là kết quả nếu dùng mẫu không tham lam ^F.+?:, dừng ở dấu hai chấm đầu tiên. "^F.+:" sai vì findall trả về đoạn văn bản khớp chứ không trả lại chính mẫu. "From:" sai vì vừa là đoạn khớp ngắn của kiểu không tham lam, vừa thiếu ngoặc vuông; findall luôn trả về list chứ không trả về chuỗi trần.
Mở trang câu hỏi này →
AThe socket.sendto(PORT) method
BThe bind(IP,PORT) method
CThe bind(PORT,IP) method
DThe socket.accept(PORT) method
Lời giải
Đáp án đúng: "The bind(IP,PORT) method". Ở phía máy chủ, sau khi tạo socket bằng socket.socket(), ta gọi bind() để gắn socket với một địa chỉ cụ thể; với họ địa chỉ IPv4 (AF_INET), địa chỉ là một tuple theo thứ tự host rồi port, ví dụ s.bind(('127.0.0.1', 9000)), sau đó mới listen() và accept() để nhận kết nối. Nói chặt, bind nhận một tuple duy nhất chứ không phải hai đối số rời, nhưng thứ tự IP trước, cổng sau là đúng. Phương án "The bind(PORT,IP) method" đảo thứ tự, đưa cổng lên trước nên sai. Phương án "The socket.sendto(PORT) method" dùng để gửi dữ liệu tới một địa chỉ (thường với UDP), không gắn địa chỉ cho socket, và đối số của nó là dữ liệu kèm địa chỉ chứ không chỉ một cổng. Phương án "The socket.accept(PORT) method" dùng để chấp nhận một kết nối đến trên socket đã bind và listen; accept() không nhận đối số và không gắn địa chỉ nào.
Mở trang câu hỏi này →
ANo
BCan be
CYes
DMay be
Lời giải
Đáp án đúng: "Yes". Socket là đầu mối của một kênh liên lạc hai chiều giữa hai tiến trình; với socket TCP như trong PY4E, ví dụ lời gọi connect tới data.pr4e.org cổng 80, một kết nối nối đúng hai điểm cuối, mỗi điểm được xác định bằng cặp địa chỉ IP và số cổng, nên đó là kết nối điểm-điểm (point to point): dữ liệu một bên gửi chỉ tới đúng bên kia. Chỗ dễ tranh cãi là "Can be" và "May be": socket UDP không thiết lập kết nối và một socket có thể gửi tới nhiều địa chỉ, nên nghe như tuỳ trường hợp; điều đó có thật, nhưng câu hỏi hỏi theo nghĩa kết nối của PY4E, tức socket TCP, nên câu trả lời vẫn là có. "Can be" vì thế biến một tính chất cố định của kết nối TCP thành điều tuỳ hoàn cảnh. "May be" cũng chỉ là cách nói lưỡng lự tương tự, không trả lời dứt khoát. "No" sai vì một kết nối TCP không dùng chung cho ba bên trở lên; máy chủ phục vụ nhiều khách là nhờ tạo một socket riêng cho mỗi kết nối.
Mở trang câu hỏi này →
AA list of all the anchor tags (<a..) in the HTML from the URL
BTrue if there were any anchor tags in the HTML from the URL
CAll of the externally linked CSS files in the HTML from the URL
DAll of the paragraphs of the HTML from the URL
Lời giải
Đáp án đúng: "A list of all the anchor tags (<a..) in the HTML from the URL". Gọi trực tiếp đối tượng BeautifulSoup như soup('a') là cách viết tắt của soup.find_all('a'): nó duyệt toàn bộ cây HTML đã phân tích và trả về một danh sách (ResultSet) gồm mọi thẻ neo (anchor tag) a, mỗi phần tử là một Tag để lấy liên kết bằng tag.get('href', None). "True if there were any anchor tags in the HTML from the URL" sai vì kết quả là danh sách thẻ chứ không phải giá trị logic; danh sách rỗng mới cho biết không có thẻ nào. "All of the externally linked CSS files in the HTML from the URL" sai vì tệp CSS liên kết nằm trong thẻ link, không phải thẻ a, và BeautifulSoup không tự tải tệp nào. "All of the paragraphs of the HTML from the URL" sai vì đoạn văn là thẻ p, phải gọi soup('p').
Mở trang câu hỏi này →
A?
B*
C.
D$
Lời giải
Đáp án đúng: ".". Trong biểu thức chính quy (regular expression), dấu chấm là ký tự đại diện (wild card), khớp với đúng một ký tự bất kỳ trừ ký tự xuống dòng; ví dụ mẫu ^X.*: khớp mọi dòng bắt đầu bằng X và có dấu hai chấm ở phía sau. Phương án "?" là bộ lượng hoá (quantifier) cho phép phần đứng trước xuất hiện 0 hoặc 1 lần, hoặc biến bộ lặp thành không tham (non-greedy), bản thân nó không khớp ký tự nào. Phương án "*" nghĩa là lặp phần đứng trước 0 lần trở lên; dễ nhầm vì trong mẫu tên tệp của hệ điều hành dấu sao là ký tự đại diện, nhưng trong regex thì không. Phương án "$" là ký tự neo khớp vị trí cuối dòng, không khớp một ký tự cụ thể. Muốn khớp dấu chấm thật phải thoát thành \. trong mẫu.
Mở trang câu hỏi này →
AThe local time zone of the sending computer without daylight savings time
BThe local time zone of the sending computer
CUniversal Time / GMT
DThe local time zone of the receiving computer
Lời giải
Đáp án đúng: "Universal Time / GMT". Khi các máy trao đổi dữ liệu qua API, bên gửi và bên nhận có thể ở bất kỳ múi giờ nào, mỗi nơi lại có quy tắc giờ mùa hè (daylight saving time) riêng. Dùng giờ quốc tế UTC, gần như trùng GMT, làm chuẩn chung, thường ghi theo dạng ISO 8601 có hậu tố Z, giúp mọi bên hiểu cùng một thời điểm mà không phải đoán; mỗi ứng dụng tự đổi sang giờ địa phương khi hiển thị. "The local time zone of the sending computer" buộc bên nhận phải biết múi giờ của bên gửi, và giờ mùa hè còn làm một số mốc bị lặp hoặc bị nhảy cóc. "The local time zone of the sending computer without daylight savings time" bớt được chuyện giờ mùa hè nhưng vẫn phụ thuộc vị trí bên gửi, mỗi nguồn dữ liệu một múi giờ khác nhau. "The local time zone of the receiving computer" không khả thi khi một API phục vụ nhiều bên nhận ở nhiều nơi, bên gửi không thể đổi theo từng người.
Mở trang câu hỏi này →
AIt optimizes files that are retrieved many times
BIt builds word clouds from web pages
CIt repairs and parses HTML to make it easier for a program to understand
DIt allows a web site to choose an attractive skin
EIt animates web operations to make them more attractive
Lời giải
Đáp án đúng: "It repairs and parses HTML to make it easier for a program to understand". BeautifulSoup là thư viện phân tích (parse) HTML và XML: nó chịu được mã HTML viết cẩu thả, thiếu thẻ đóng, lồng sai, tự sửa thành một cây hợp lệ, rồi cho chương trình tìm thẻ và đọc thuộc tính dễ dàng, nên rất hay dùng để thu thập dữ liệu web (web scraping). "It optimizes files that are retrieved many times" sai vì nó không lưu đệm (cache) hay tối ưu tệp tải nhiều lần. "It builds word clouds from web pages" sai vì đám mây từ là việc của thư viện khác như wordcloud, BeautifulSoup chỉ có thể là bước lấy chữ đầu vào. "It allows a web site to choose an attractive skin" sai vì giao diện trang do CSS và mã phía trang quyết định. "It animates web operations to make them more attractive" sai vì nó không tạo hiệu ứng động, chỉ đọc và phân tích tài liệu.
Mở trang câu hỏi này →
AGET
BPOST
CPUT
DDELETE
EINFO
Lời giải
Đáp án đúng: "GET". Khi người dùng bấm vào một thẻ neo (anchor tag), tức thẻ a có thuộc tính href, trình duyệt gửi một yêu cầu HTTP GET tới URL ghi trong href để lấy trang hoặc tài nguyên đó về hiển thị; GET là phương thức dùng để đọc, lấy dữ liệu từ máy chủ. Đề nhắc "like below" nhưng bản in thiếu đoạn thẻ ví dụ; câu vẫn trả lời được vì mọi liên kết thường đều dẫn tới yêu cầu GET. Phương án "POST" dùng để gửi dữ liệu lên máy chủ, điển hình khi nộp một biểu mẫu khai báo method là post, không phải khi bấm một liên kết thường. Phương án "PUT" dùng để tạo hoặc thay thế tài nguyên tại một URL, hay gặp trong API, trình duyệt không dùng nó khi mở liên kết. Phương án "DELETE" yêu cầu máy chủ xoá tài nguyên, cũng chỉ dùng trong API. Phương án "INFO" không phải phương thức HTTP chuẩn; các phương thức có thật gồm GET, POST, PUT, DELETE, HEAD, OPTIONS và PATCH.
Mở trang câu hỏi này →
AHow much memory does the server need to serve requests?
BWhat is the IP address for a domain like www.dr-chuck.com?
CHow long do we wait before packets are retransmitted?
DWhich application talks first? The client or server?
Lời giải
Đáp án đúng: "Which application talks first? The client or server?". Giao thức tầng ứng dụng (application layer protocol) như HTTP là bộ quy tắc hai chương trình thống nhất để nói chuyện qua một kết nối đã có sẵn: ai nói trước, nói gì, theo định dạng nào và khi nào kết thúc. Với HTTP, trình khách nói trước bằng một yêu cầu như GET kèm đường dẫn, máy chủ đáp lại bằng dòng trạng thái, các header và nội dung. "How much memory does the server need to serve requests?" là chuyện cấu hình phần cứng của máy chủ, giao thức không quy định. "What is the IP address for a domain like www.dr-chuck.com?" là việc của DNS, hệ thống phân giải tên miền, diễn ra trước khi HTTP bắt đầu. "How long do we wait before packets are retransmitted?" thuộc tầng giao vận: TCP lo việc gửi lại gói tin bị mất, nhờ vậy tầng ứng dụng không phải bận tâm.
Mở trang câu hỏi này →
Aencode()
Brstrip()
Cinternal()
Ddecode()
Esplit()
Lời giải
Đáp án đúng: "decode()". Dữ liệu đọc từ mạng, chẳng hạn kết quả read() của urlopen hay recv() của socket, có kiểu bytes: một dãy byte đã được mã hoá, thường theo UTF-8; còn str của Python 3 lưu ký tự Unicode ở dạng nội bộ, nên phải gọi decode() để chuyển bytes thành str trước khi xử lý như chuỗi. "encode()" làm chiều ngược lại, biến str thành bytes, dùng trước khi gửi dữ liệu đi qua mạng. "rstrip()" chỉ cắt khoảng trắng và ký tự xuống dòng ở bên phải, kiểu dữ liệu không đổi; gọi trên bytes vẫn trả về bytes. "internal()" không tồn tại trên bytes hay str; tên này chỉ mượn chữ internal trong câu hỏi. "split()" tách thành list các phần, và bytes.split vẫn trả về các phần tử kiểu bytes, nên không đổi sang dạng chuỗi.
Mở trang câu hỏi này →
AFTP
BSMTP
CHTTP
DPOP3
Lời giải
Đáp án đúng: "HTTP". HTTP (HyperText Transfer Protocol, giao thức truyền siêu văn bản) là giao thức tầng ứng dụng mà trình duyệt và máy chủ web dùng để yêu cầu và trả trang web: trình duyệt gửi một yêu cầu như GET /page.htm HTTP/1.0, máy chủ trả về các header rồi tới nội dung; phiên bản mã hoá của nó là HTTPS. Phương án "FTP" (File Transfer Protocol) dùng để truyền tệp giữa máy khách và máy chủ, không phải giao thức chính để lấy trang web. Phương án "SMTP" (Simple Mail Transfer Protocol) dùng để gửi thư điện tử giữa các máy chủ thư. Phương án "POP3" (Post Office Protocol phiên bản 3) dùng để tải thư điện tử từ hộp thư trên máy chủ về máy người dùng. Những giao thức này đều chạy trên TCP giống HTTP nhưng phục vụ mục đích khác.
Mở trang câu hỏi này →
34In the following XML, which are attributes?5 lựa chọncó code
Đề bài
<person>
  <name>Chuck</name>
  <phone type="intl">
    +1 734 303 4456
  </phone>
  <email hide="yes" />
</person>
Atype
Bemail
Cperson
Dname
Ehide
Lời giải
Đáp án đúng gồm hai ý: "type" và "hide". Thuộc tính (attribute) trong XML là cặp tên bằng giá trị đặt trong nháy, viết bên trong thẻ mở của một phần tử: ở đây thẻ phone mang thuộc tính type với giá trị intl, còn thẻ tự đóng email mang thuộc tính hide với giá trị yes. Trong Python với ElementTree, ta đọc thuộc tính bằng get, ví dụ tree.find('phone').get('type') cho 'intl'. "person" là tên phần tử gốc (root element) bao toàn bộ tài liệu, không phải thuộc tính. "name" là một phần tử con chứa văn bản Chuck, đọc bằng thuộc tính text chứ không bằng get. "email" là tên một phần tử, cụ thể là thẻ tự đóng không có nội dung; nó là nơi mang thuộc tính hide chứ bản thân nó không phải thuộc tính.
Mở trang câu hỏi này →
Asocket.accept()
Bsocket.sendto(address)
Csocket.acceptsocket
Daccept.socket()
Lời giải
Đáp án đúng: "socket.accept()". Một chương trình máy chủ TCP thường đi qua các bước: tạo socket, gọi bind() gắn địa chỉ và cổng, listen() để bắt đầu lắng nghe, rồi gọi accept(); accept() chờ tới khi có máy khách từ máy khác kết nối tới, sau đó trả về một cặp gồm socket mới dành riêng cho kết nối đó và địa chỉ của máy khách. Phương án "socket.sendto(address)" dùng để gửi dữ liệu tới một địa chỉ, chủ yếu với socket UDP, không nhận kết nối nào, và còn cần thêm đối số dữ liệu. Phương án "socket.acceptsocket" không phải phương thức nào của mô-đun socket, lại thiếu cặp ngoặc gọi hàm. Phương án "accept.socket()" đảo ngược tên đối tượng và phương thức: accept là phương thức của đối tượng socket nên phải viết theo thứ tự đối tượng rồi phương thức, không có đối tượng accept nào chứa phương thức socket.
Mở trang câu hỏi này →
AThe Request/Response Cycle
BIMAP
CInternet Protocol (IP)
DDECNET
ESMTP
Lời giải
Đáp án đúng: "The Request/Response Cycle". Khi trình duyệt tải một trang, nó mở kết nối tới máy chủ, gửi yêu cầu (request) HTTP như GET /page.html, máy chủ trả về phản hồi (response) gồm phần đầu và nội dung, trình duyệt hiển thị rồi mỗi lần người dùng bấm liên kết lại lặp một vòng yêu cầu mới; chuỗi lặp đó gọi là chu trình yêu cầu/phản hồi. "IMAP" sai vì đó là giao thức đọc thư điện tử trên máy chủ thư. "Internet Protocol (IP)" sai vì IP là tầng định tuyến gói tin bên dưới, HTTP chạy trên TCP/IP chứ IP không phải tên của việc tải trang. "DECNET" sai vì đó là bộ giao thức mạng cũ của hãng Digital Equipment Corporation, không liên quan tới web. "SMTP" sai vì đó là giao thức gửi thư điện tử.
Mở trang câu hỏi này →
AThat the web site allows scraping
BThat the web site supports the HTTP GET command
CThat the web site returns HTML for all pages
DThat the web site only has links within the same site
Lời giải
Đáp án đúng: "That the web site allows scraping". Trước khi viết chương trình tự động tải và bóc dữ liệu từ một trang (web scraping), cần xem trang có cho phép điều đó không: đọc điều khoản sử dụng và tệp robots.txt ở gốc tên miền, vì có trang cấm thu thập tự động hoặc chỉ cho phép ở mức độ nhất định; bỏ qua bước này có thể bị chặn địa chỉ IP hoặc vi phạm điều khoản. Phương án "That the web site supports the HTTP GET command" không cần kiểm vì mọi máy chủ web đều phục vụ trang qua GET, đó chính là cách trình duyệt mở trang. Phương án "That the web site returns HTML for all pages" không phải điều kiện: chương trình có thể xử lý cả JSON, XML hay ảnh tuỳ theo trang. Phương án "That the web site only has links within the same site" không liên quan: liên kết trỏ ra trang khác chỉ cần lọc khi lần theo, chứ không quyết định có được phép thu thập hay không.
Mở trang câu hỏi này →
APacket
BSession
CData Link
DPhysical
Lời giải
Đáp án đúng: "Packet". Mô hình OSI có bảy tầng, từ dưới lên: Physical, Data Link, Network, Transport, Session, Presentation, Application. Packet (gói tin) không phải tên tầng mà là tên đơn vị dữ liệu ở tầng Network, nơi giao thức IP định tuyến các gói giữa các mạng; tương tự frame là đơn vị dữ liệu ở tầng Data Link. "Session" là tầng thứ năm, quản lý phiên làm việc giữa hai ứng dụng: mở, duy trì và đóng phiên. "Data Link" là tầng thứ hai, truyền khung dữ liệu giữa hai thiết bị kề nhau trên cùng đường truyền, ví dụ Ethernet hay Wi-Fi, dùng địa chỉ MAC. "Physical" là tầng thứ nhất, lo tín hiệu điện, sóng vô tuyến hay ánh sáng trên dây cáp. Ba tầng này đều có thật trong OSI nên không phải câu trả lời cho câu hỏi phủ định này.
Mở trang câu hỏi này →
A103
B14
C7
D71
Lời giải
Đáp án đúng: "71". Bảng mã ASCII gán chữ hoa từ 65 cho A, 66 cho B, rồi tăng dần nên G là chữ thứ bảy có mã 65 + 6 = 71; kiểm tra bằng ord('G') trong Python cho 71, ngược lại chr(71) cho 'G'. "103" sai vì đó là mã của chữ thường g; chữ thường bắt đầu từ 97 cho a, cách chữ hoa tương ứng đúng 32. "7" sai vì đó chỉ là vị trí của G trong bảng chữ cái, không phải mã số; mã 7 trong ASCII là ký tự điều khiển chuông BEL. "14" sai vì mã 14 là ký tự điều khiển SO (Shift Out), không phải chữ in được; mọi ký tự từ 0 tới 31 đều là ký tự điều khiển.
Mở trang câu hỏi này →
Đề bài
import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if (len(data) < 1):
        break
    print(data.decode())
mysock.close()
Amysock.recv()
Bsocket.socket()
Cmysock.close()
Dmysock.connect()
Emysock.send()
Lời giải
Đáp án đúng: "mysock.recv()". Lần theo mã: lời gọi recv(512) nhận tối đa 512 byte từ kết nối và trả về bytes, đó là chỗ dữ liệu thật sự được đọc; vòng while lặp lại cho tới khi recv trả về dữ liệu rỗng (độ dài nhỏ hơn 1), nghĩa là máy chủ đã đóng kết nối, và mỗi khối nhận được được decode rồi in ra. "socket.socket()" chỉ tạo đối tượng socket, với AF_INET là IPv4 và SOCK_STREAM là TCP, chưa kết nối hay đọc gì. "mysock.connect()" mở kết nối TCP tới data.pr4e.org ở cổng 80, mới là bước thiết lập đường truyền. "mysock.send()" gửi yêu cầu GET đã được mã hoá thành bytes tới máy chủ, là chiều đi chứ không phải đọc. "mysock.close()" đóng kết nối sau khi đã đọc xong, giải phóng tài nguyên.
Mở trang câu hỏi này →