TA的每日心情 | 开心 2019-8-21 08:44 |
---|
签到天数: 163 天 [LV.7]常住居民III
|
本帖最后由 mikeee 于 2019-2-6 22:50 编辑
' m3 e8 q& s; V, @0 s1 S1 z" C8 r
/ V' Y5 I3 n: S% o1 C再来用 PDF 做个 mdx,Dictionary of Cliches的pdf文件论坛里可以搜到。大致看了一下,估计两小时的工作量——最后用了不下10小时。步骤:- 上传pdf到 https://pdftohtml.net, 几分钟后下载转成了 html 的文件。
- 用 Chrome 打开解压后得到的 html 文件, F12调出 devtools。稍微研究一下后即可得知,div.cls_025>span.cls_025,div.cls_025>span.cls_023,div.cls_023 的 css selector 可以完美定位所需的内容。div.cls_025>span.cls_025 定位的是词头, div.cls_025>span.cls_023,div.cls_023定位词义。几行python搞定。(用 bs4 或lxml应该也是可以的, 其实pq是基于 lxml的etree元素。用node的cheerio的话基本思想差不多,码可能更简洁。用正则的话当然就用不了css selectors,可能会繁琐一点。)
- from pyquery import PyQuery as pq
$ F. z1 F$ ~6 V( _: q( K - 2 r2 E$ ?9 U5 |7 w& Q. A, b
- file = r'C:\Users\xyz\Downloads\Dictionary of Cliches (Facts on File)\b67f0a6e-1e61-11e9-8f58-0cc47a792c0a_id_b67f0a6e-1e61-11e9-8f58-0cc47a792c0a.html'
. o/ j% T) v4 H Y - doc = pq(open(file, encoding='utf8').read())
2 a( n7 {' i1 Q4 A- | - # V/ g" R7 f8 S# M. o
- hw_css = 'div.cls_025>span.cls_025'$ J2 i7 M0 R$ H9 E
- ctx0_css = 'div.cls_025>span.cls_023'
* ]- v' l, S5 {% d/ L7 l; \, @ - ctx0a_css = 'div.cls_025>span.cls_028'# t1 ]+ {5 p9 G
- ctx0b_css = 'div.cls_028' # capital, references
2 h# t" ^+ [1 ?/ K8 S - ctx0c_css = 'div.cls_027' # italics, book names
* x0 K/ E; d$ m/ r - ctx1_css = 'div.cls_023'
8 U0 q0 B4 b* o: I' ]- M - hw_ctx_css = f'{hw_css},{ctx0_css},{ctx0a_css},{ctx0b_css},{ctx0c_css},{ctx1_css}'2 u4 K) j0 B9 r/ h2 C
9 K0 G0 }% x. @0 U- # css selector 到最后比我预期的复杂些, 所以用 abbyy finereader 可能比用 pdftohtml.net 简单些。8 m g) I; y3 A$ ^ V3 f
- items = doc(hw_ctx_css)
复制代码 我们要的东西在 items 里。稍微处理一下 items 得到 由(词头,词义)组成的 entries- entries = []
5 c1 U. J6 x. L# ~ \ - hw = ''
; }1 N% P8 Y6 ]8 s) z$ I) D9 c- D - ctx = ''1 a0 D; C4 j9 [! u
- * C* a' \7 H8 J4 G+ A
- upper_b = 50
' {& t( r% [ j0 U! N- F - for elm in items[: upper_b]:5 B& P( o8 F% I/ X4 B
- tmp = pq(elm)
2 p5 Z9 j5 q, c7 B* R - if tmp.attr('class') == 'cls_025':5 L( S6 h& i \5 ]8 J e( W0 E
- * G, j2 B- K# s$ V- _1 Z3 S
- entries += [(hw, ctx)]
+ ~8 |7 v' D2 u* N
- V- u" T+ i/ L( x/ E) t" m3 o, A- hw = tmp.text()3 V- e; r: s# F0 \. i" p P+ S" @
- ctx = ''
- a! N# t" ~+ B6 Y& }) }$ ? - else:: Q! k; s% a: X) M# T: w3 R
- ctx += f' {tmp.text()}'
8 y) B# B7 b4 v8 B
# s4 W* n0 s. j+ _6 h0 r- # collect the last batch. ], k* O0 F* D, _+ x
- entries += [(hw, ctx)]& |3 U6 A7 y4 t
- ; \1 ]- D) n/ L" X. M) t7 S
- def proc_func(ctx):9 e! I* W0 u4 N4 S$ z
- ctx = ctx.strip()( S, x0 {3 U( @: J# L8 u
, r5 ^1 ?/ ]! M7 ^; k- s0 Y- # insert a space after .: [a-z]\.)([^\s])
; ], g, ?3 f! F! O( x* G - ctx = re.sub(r'([a-z]\.)([^\s])', r'\1 \2', ctx)
0 H/ `6 c4 i7 h& e! C
0 f& S4 U% |2 f' N2 v- # remove spaces
; t- \5 t' r" H9 j. ^ - ctx = re.sub(r'\s\s+', r' ', ctx)7 E9 C3 N& @% L5 X6 `
- return ctx
! y B2 `" E4 w- x2 ]$ O - + j w2 M3 a* C
- entries = [(elm[0], proc_func(elm[1])) for elm in entries]; Z8 G% l/ `2 S
- % P/ |! w$ ~" F8 l% u* g
- print(entries[:3])
复制代码 输出为- [('', '—Christine Ammer —Christine Ammer'), ('about face, to do an', 'To reverse a decision or change one’s opinion. The term comes from the American military command to turn 180 degrees at attention, dating from the mid-nineteenth century, and by 1900 was being used figuratively. A more recent colloquial usage is to do a 180, but it has not yet reached cliché status.'), ('about the size of it', 'An approximately accurate version of a situation, event, or circumstance. It generally is used as a summing up: “That’s about the size of it. ”')]
复制代码 基本大功告成了。其实后面还是有很多事要做。 - 转成(mdxbuilder可用的) mdxhtml 格式(其实也可以直接用writemdict直接做成 mdx)。pdftohtml.net 转的html含位置信息,要抽取词头和释义以及参考链接还是要费点周折。折腾了几个晚上。结果是上传的三个py文件(mapping_dict.py用于处理一些特殊的链接)。运行 gen_mdicthtml.py 即可生成 dict_of_cliches_mdict.html。用 mdxbuilder 处理 dict_of_cliches_mdict 即可得到 mdx 和 mdd。所有的 py、html及 css、封面 png 打成包(见附件),python码比较乱,没有整理,但Py3.6下是可以运行的,有兴趣的网友可以折腾一下。
- Mdxbuilder 处理 dict_of_cliches_mdict.html 生成 mdx、mdd。(见附件)词头做了分拆,有交叉索引链接。见下图。
- 改进:找时间再做个可以查独立单词或词组的详细索引,进一步提高字典的可用性。
- 结语:如果 pdf 文件的内容是英文的并且可以拷出来,用 pdftohtml.net 转 html 再用 css selector 可以非常方便的自动处理词头和释义。但也有不少坑——漏掉一类 css selector就会导致内容的遗失。5 ^4 [1 D" i$ i
, d# p& ?3 S4 E! H4 z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
1
查看全部评分
-
|