haschema

Lấy text từ file Google Docs chỉ cho phép đọc

Đăng bởi: haschema
Saturday, 25 Aug 2018

Tuần vừa rồi muốn đọc truyện Mao Sơn Tróc Quỷ Nhân nhưng tìm khắp các trang truyện Việt thì thấy không trang nào dịch tiếp nữa :disappointed_relieved: . Rà soát một hồi thì tìm được một trang Blogspot :open_mouth: của một bác nào đó đã bỏ công sức ra để edit truyện cho (anh) em đọc mà chỉ có mỗi cái quảng cáo ở đầu trang.

Để chặn người khác copy truyện thì trang này dùng hẳn file Google Docs với quyền Only View và nhúng vào trong bài. Mình thì hay đọc trên điện thoại nên nếu để như vậy khá là khó chịu, vì vậy nên lần mò tìm cách copy text về đọc.

Tìm hiểu cách Google "dấu" text

Đầu tiên, thì mình có một link truyện ở đây: https://docs.google.com/document/d/1Kcpfs2DF3L1IQ5NyO87ncBczcN2fBCYhRu0a6lL44MQ/preview

Có thể thấy trang này đã chặn copy, click chuột phải nhưng để vào Chrome DevTools thì vẫn có thể bấm tổ hợp Ctrl+Shift+I. Nhưng để xem toàn bộ nguồn trang thì không thể bấm Ctrl+U được. Tuy nhiên, có một các đơn giản là thêm vào trước https đoạn view-source:. Kéo xuống xem code ta được:

Do không quan tâm đến định dạng của nó nên ta chỉ cần tập trung vào đoạn text tìm được. Đây rõ ràng là nội dung truyện. Google "xuống dòng" bằng cách dùng \n. Vậy để đơn giản thì ta chỉ cần copy text về sau đó replace \n bằng \n thật là được.

Viết Code xử lý và lấy text

Bởi vì dùng request thì ta lấy được source code của nguyên trang, tức là được text và kèm theo một mớ thẻ định dạng các kiểu nên... nên ta cần loại bỏ chúng trước bằng lệnh:

from bs4 import BeautifulSoup
import requests
html_source = requests.get(link,)
truyen_raw = ''
docs = str(BeautifulSoup(html_source.text,'lxml').get_text())

Rất may mắn là bác edit truyện đã cấu trúc sẵn cho đoạn text bắt đầu bằng chữ Chương nên dễ dàng dùng mấy đoạn regex sau:

chuoi1 = re.search(r'\A(.*?)\"s\"\:\"C',docs)
docs = docs.replace(chuoi1.group(0),'C')
chuoi2 = re.search(r'\"\}(.*?)\"s\"\:\"',docs)
docs = docs.replace(chuoi2.group(0),'')
chuoi3 = re.search(r'\"\}(.*?)\Z',docs)
truyen_raw = str(docs.replace(chuoi3.group(0),''))

Chữ C ở đây đại diện cho chữ chương

Tiếp theo là thay \n:

truyen_raw = truyen_raw.replace('\\n','\n')

Như vậy là đã xong! Lấy text về bỏ lên gitbook đọc dần.

Thử lấy text ở đây: https://laytextgoogle.herokuapp.com/get/1Kcpfs2DF3L1IQ5NyO87ncBczcN2fBCYhRu0a6lL44MQ

Link trên mình đã cập nhật để nó có thể lấy text mà không cần phải biết chữ C nữa :smile: và hiện tại chỉ có thể truy cập các file đã public. Để check thử 1 file có public hay không? Hãy thử truy cập bằng tab ẩn danh.

Link phải là của docs.google.com nếu drive.google.com thì chịu!!!