-1

HTMLコードがあるとします。壊れています(別のプログラムから与えられます)。その中のすべての画像を見つけて、src属性を何らかのコードに変更する必要があります。それがすべてです-最終的に壊れたままにする必要があります。

これは私のコードです:

# -*- coding: utf-8 -*-

from lxml import etree
from StringIO import StringIO

def test(text):
    text = analyze_dir_template_imgs(text)
    return text

def analyze_dir_template_imgs(text):
    ts = [
        {
            'name':'img',
            'path':"//img[@src]",
            'attrib': 'src',
        },
    ]

    parser = etree.HTMLParser()

    for t in ts:
        tree = etree.parse(StringIO(text), parser)
        path = t['path']
        name = t['name']
        attrib = t.get('attrib', False)

        text = str_repr(tree.getroot())

        #text_to_file(text, 'temp/template_dir.html', 0, 'wb')

        links = tree.xpath(path)

        i = 0
        for l in links:
            i+=1
            #print
            #print l
            y0 = l.attrib[attrib]
            print y0

            x0 = str_repr(l)
            if name=='img':
                repl_to = '[image]'

                x0_new = x0.replace(y0, repl_to)

                text = text.replace(x0, x0_new)
    print text
    return text

def str_repr(el, enc='utf-8'):
    text = etree.tostring(el, pretty_print=True, method='xml', encoding=enc)
    return text

if __name__ == "__main__":
    text = u'''
<a href="[link]">[name]</a>
            </h2>

<img width="280" style= "margin: 10px; float:left;" alt ="привет мир" src = "/[[template]]/image.jpg"><p>[[body]]</p>

<div class="jcomments-links">
<a href="[link]" class="readmore-link">more...</a> </div>



<div class="item-separator">'''

    test(text)

しかし問題は、このプロセス中に lxml が html コードを修正することです。つまり結果は

<html><body>
<a href="%5Blink%5D">[name]</a>
...

しかし、私の結果は

<a href="[link]">[name]</a>

それは最初のコードの始まりだったからです。

私の仕事は src を変更することだけであり、この新しく変更されたコードは別のスクリプトに送信され、さまざまなコードがまとめられます。

そして別の問題はそれがy0 = l.attrib[attrib]与えることです/[[template]]/image.jpgが、x0 = str_repr(l)与える<img width="280" style="margin: 10px; float:left;" alt="привет мир" src="/%5B%5Btemplate%5D%5D/image.jpg"><p>[[body]]</p>- のような特別な記号[がに変更されているのを見る/%5Bと、元のhtmlコードのようにこの部分を取得したいのです。

lxmlを使用してこの問題を正しく解決するには? ありがとう。

4

1 に答える 1

2

次の行を置き換えます。

text = etree.tostring(el, pretty_print=True, method='html', encoding=enc)

と:

text = etree.tostring(el, pretty_print=True, method='xml', encoding=enc)

>>> root = etree.fromstring('<a href="[link]">more...</a>')
>>> etree.tostring(root, method='html')
'<a href="%5Blink%5D">more...</a>'
>>> etree.tostring(root, method='xml')
'<a href="[link]">more...</a>'
于 2013-11-10T09:35:41.270 に答える