7-23<X8>dialect.xml HTML 处理

  • 感谢 zhangfance。

    本章频繁 typo:显示显式混用。

8.1 概览

  1. Para 1How do I parse/translate/munge the text of my HTML document but leave the tags alone?
    怎么才能 [分析|解释|munge] 我的 HTML 文档的文本,但是不要标记呢
    (!) “leave alone”的意思是“不惊动,不涉及”,而非“不要”。
    (./) 怎么才能 [分析|解释|munge] 我的 HTML 文档的文本,但是又要保留标记呢

8.2 sgmllib.py 介绍

  1. Para 5:开始标记(Start tag)是一个 {X} 开始一个块的 HTML 标记,像……

  2. 警示, Line -1在这 <!> 错误在 python 2.1 中改正了。 (./) 这个

8.3 从 HTML 文档中提取数据

  1. Para 2If you have some HTML lying around on your hard drive, you can use file functions to read it,... 如果在您的硬盘里存放着 HTML 文件,您可以使用 file 函数 将它读出来,……
    (!) 就链接的指向来看,file functions 指的是 (./) 处理文件的函数

  2. 例8.6, (1), Line -1:……当某人重用一个分析器实例时, <!> 正确地重新初始化 (./) 可以

  3. 例8.6, (3):我们可以通过一个简单的 多变量 list 映射来查找是否这个 <a> 标记拥有一个 href 属性。
    (./) 我们可以通过一个简单的 多变量 list 映射来查找这个 <a> 标记是否拥有一个 href 属性。

  4. 例8.7, (1), 脚注:……也许因为这就选择了 feed 这个名字。 (!) 汉语博大精深的词汇怎么不好好利用啊 (./) 因此

  5. 整节 Line -1{i} 如果 当您读到此处发现输出结果不一样,那是因为下载了本书的更新版本。

8.4 BaseHTMLProcessor.py 介绍

  1. Para 1:您可以通过将 SGMLParser 子类化来定义一个类,……
    (./) 您可以定义 SGMLParser 的子类,……

  2. Para 2SGMLParser 子类化 BaseHTMLProcessor (./) BaseHTMLProcessor 子类化 SGMLParser

8.5 locals 和 globals

  1. ……一会 {i} 我们就会看到

  2. 例8.10上, Para 1, Line 1:您是否为此而感到困惑?不要绝望(!) 汗……哪这么容易绝望
    (./) 您是否为此而感到困惑?不要灰心

  3. 例8.10下, Para 1不仅仅是模块的名字空间包含了模块级的变量和常量,它还包括了所有在模块中定义的函数和类。再加上,它包括了任何被导入到模块中的东西。
    (./) 模块的名字空间不仅仅包含了模块级的变量和常量,包括了所有在模块中定义的函数和类。除此以外,它包括了任何被导入到模块中的东西。

  4. 下一段:这就是为什么您可以直接访问它们却不需要引用它们所来源的模块的原因 {X}
    (!) 原句明显病句(句式杂糅)。

  5. 例8.11, 样例输出:原文最后的“rest of output omitted for brevity”翻译为“略”是正确的。但是这段输出是放在<programlisting>里面的,在语法着色的时候会把中文分解成XML标记,显示出来也是XML标记而不是中文。改回“rest of output omitted for brevity”。

  6. 例8.11, 样例输出, (1)SGMLParser 使用了 from module import 从 sgmllib 中被导入。
    (!) 中文的表达采用主动式更自然。
    (./) 我们使用了 from module import SGMLParser 从 sgmllib 中导入。

  7. 例8.11, 样例输出, (2):对比这个和 htmlentitydefs,它是用 import 被导入的。也就是说 htmlentitydefs 模块本身也在名字空间中,但是 entitydefs 变量定义在 htmlentitydefs 之外。
    (!) 上下文无法全部列出,还请参看原文。
    (./) 把上面的例子和 htmlentitydefs 对比一下,它是用 import 被导入的。也就是说 htmlentitydefs 模块本身被导入了名字空间,但是定义在 htmlentitydefs 之中的 entitydefs 变量却没有

  8. 例8.11, 样例输出, (4):当运行一个模块时 ( <!> 从另外一个模块中导入而言) (./) 相对于

  9. 例8.12上, Line -1It will bite you anyway, but at least then you'll remember learning it.
    它无论如何都会困扰您的,但至少您还记得了解过它。
    (./) 它无论如何都会困扰您的,但至少您还会记得曾经学习过它。

  10. 例8.12, (1):locals 是一个返回 dictionary 的函数,并且 {i} 在 dictionary 中设置 {i} 一个值。

8.6 基于 dictionary 的字符串格式化

  1. 例8.13, (1):这个名字是 params dictionary 中的一个键字,并且将 %(pwd)s 标记所在的地方替换成相应的值 secret。
    (./) 所以 %(pwd)s 标记所在的地方替换成相应的值 secret。

  2. 例8.13, (3)You can even specify the same key twice; each occurrence will be replaced with the same value.
    您甚至可以两次指定同一键字,每个键字发生之处将被同一个值所替换。
    (./) 您甚至可以两次指定同一键字,每个键字出现之处将被同一个值所替换。

  3. 例8.14上Well, it does seem like overkill to set up a dictionary of keys and values simply to do string formatting in the next line;
    好,在下面一行中,仅为了进行字符串格式化就需要创建一个有键字和值的 dictionary 看上去的确有些小题大作。
    (./) 的确,仅为了进行字符串格式化,就事先创建一个有键字和值的 dictionary 看上去的确有些小题大作。
    (!) 看看原文就不难知道孰正孰误。“下一行”这个意思没有保留。原文的next line也只是笼统的概念,不一定创建了这样一个 dictionary 后就非得在下一行进行字符串格式化。

  4. 例8.15, (1), b:在这个列表理解 <!> 的第一轮循环中,…… (./) 解析

  5. 例8.15, (1), c:这个字符串就作为这个列表理解 <!> 返回值的第一个元素。 (./) 解析

8.7 给属性值加引号

  1. Para 2:即使它们可能以大写字母开始或是大小写的混和 <!> 形式。 (./) 混合 (!) 连我自己起初都不相信,但这确实是错别字。

  2. 例8.16, 标题:Quoting attribute values (!) 又一次没有翻译 (./) 给属性值加引号

8.8 dialect.py 介绍

  1. 例8.17, (1)每次 SGMLParser 在 HTML 源代码中…… (!) 此处的“每次”改为 (./) 每当。后面相似的句型作一样的修改,不再列出。

  2. 例8.17, (2):我们可以将它作为一个标志,并且把它设为 1 或重置为 0,但这样做……
    (./) 我们本可以把它实现为一个标志,即或把它设为 1,重置为 0,

  3. 例8.18, (1)The only thing left to do is figure out whether there is a specific handler method for this tag, or whether you should fall back on the default method.
    唯一要做的事情就是找到对于这个标记是否存在一个特别的处理方法,或者是否我们应该求助于缺省方法。
    (./) 唯一要做的事情就是检查对于这个标记是否存在一个特别的处理方法,否则我们应该求助于缺省方法。

  4. 例8.18, (2):您以前可能还没注意到的是 getattr 将查找定义在一个对象的继承者中或对象自身的方法。
    (./) 您以前可能还没注意到 getattr 将查找定义在一个对象的继承者中或对象自身的方法。

  5. 例8.18, (4):正如您看一 <!> 的,…… (!) typo (./) 看到

  6. 例8.18, (5):……来调用 getattr 实败 <!> 了。 (./) 失败

  7. 例8.18, (8)start_xxx and do_xxx methods are not called directly; the tag, method, and attributes are passed to this function, handle_starttag, so that descendants can override it and change the way all start tags are dispatched. You don't need that level of control, so you just let this method do its thing, which is to call the method (start_xxx or do_xxx) with the list of attributes.
    start_xxx 和 do_xxx 方法并不被直接调用标记名、方法和属性被传给 handle_starttag 这个方法,以便继承者可以覆盖它,并改变 全部 开始标记分发的方式。我们不需要控制层,所以我们只让这个方法做它自已的事,就是用属性属性 {X} 的 list 来调用方法 (start_xxx 或 do_xxx) 。
    (!) that level of controlcontrol而非level是中心语 (./) start_xxx 和 do_xxx 方法并不被直接调用标记名、方法和属性被传给 handle_starttag 这个方法,以便继承者可以覆盖它,并改变 全部 开始标记分发的方式。我们不需要控制这个层面上,所以……

  8. 例8.19上:当我们跑题时,我们正在定义 <!> 特别的处理方法来处理…… (./) 定义了

8.9 全部放在一起

  1. Para 1:到了 {X} 将迄今为止我们已经学过并用得不错的东西放在一起的时候了。

  2. 例8.20, (3)Now you get the source of the given URL.
    现在我们得到了给定的URL的原始资料了(./) 现在我们得到了给定的 URL 源文件了

  3. 例8.21, (1)Combined with some string formatting, you've taken the name of a dialect and transformed it into the name of the corresponding Dialectizer class.
    与某个字符串格式化合在一起使用后,我们就得到了一种方言的名字,接着将它转化为相应的方言变换器类的名字。
    (./) 再使用字符串格式化,我们就得到了一种方言的名字,将它转化为相应的方言变换器类的名字。

  4. 例8.21, (2):我们有了一个字符串形式 (parserName) 的类名称,还有一个 dictionary (globals()) 形式的全局名字空间。合起来后,我们可以得到一个以前面字符串 <!> 命名的类的引用。 (./) 前者

  5. 例8.21, (3):……像函数一样调用类。这个类保存在一个局部变量中的事实完全不会有什么影响;……
    (./) 这个类保存在一个局部变量中,但这个事实完全不会有什么影响

  6. 例8.21下, Para 1Why bother?
    怎么这么麻烦?
    (./) 何必这么麻烦?

  7. 例8.22, (1)After all that imagining, this is going to seem pretty boring, but the feed function is what does the entire transformation.
    毕竟那只是假设,这个似乎会非常令人讨厌,但这个 feed 函数执行了全部的转换工作。
    (./) 剩下的工作似乎会非常无聊,但实际上,feed 函数执行了全部的转换工作。

  8. 进一步阅读:您可能会认为我正在拿服务端脚本编程开玩笑。在我发现这个 基于 web 的方言转换器 之前,的确是这样认为的。
    (./) 您可能会认为我的服务端脚本编程的想法是开玩笑。在我发现这个 基于 web 的方言转换器 之前,的确是这样的。

8.10 小结

  1. 汇集结果,如 URL lister (!) 根据 URL lister 的实际用途,改为 (./) 摘录结果

  2. 按结构的方式对其进行修改,如 属性引用
    (./) 在处理过程中顺便调整结构,如 给属性值加引号

8.-1 反馈

Name Password4deL ;) =D =) :P :(|) :-| :( X-( B-)