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を使用してこの問題を正しく解決するには? ありがとう。