2013-12-17 4 views
5

bir dizeden html okumak için LXML kullanmak ve sonra tüm img etiketlerini bulmaya, görüntü src özniteliği güncellemek ve her resim etrafında hiper bağlantı eklemek çalışıyorumLxml piton yük html başlığı ve gövdesi olmadan dize ve eklemek eleman etrafında hedeflenen elemanları

nedenle bu,

<img src="old-value" /> 

karşı karşıyayım bu

<a href=""><img src="new-value" /></a> 

sorunu olacak ilk html dize, yüklemek için etree.HTML kullanıyorum, iki bulduğu f ya da bir nedeni html etiketinin kendisine ve html etiketine beden etiketi ekliyor. Bunu otomatik olarak meydana gelmeden otomatik olarak yüklemenin bir yolu var mı?

başka sorun

i resim etiketi etrafında hiper link öğesi ekleyin, nasıl çözmek mümkün değilim, aşağıda denedik ama img etiketi

tree = etree.HTML(self.content) 
imgs = tree.xpath('.//img') 
thm = "new-value" 
for img in imgs: 
    img.set('src', thm) 
    a = etree.Element('a', href="#") 
    img.insert(0, a) 

herhangi bir içinde hiper bağlantı elemanı eklersiniz tavsiye edebilir misiniz lütfen?

güncelleme:

Sadece @Alko ve onun iyi çalışıyor tarafından sağlanan yaklaşım denedik ama içeriğin türü kullanıyorum ile ilgili bir sorun vardır.

img etiketi,

<html><body><p><img src="/public_media/cache/66/ed/66edd1c01e3027ba18bef9244ca8e8b4.jpg?id=31"/>jshjksh skjhs jksh skjhsj ksh jkshs kjhs kjsh sjkhs khs ksh skh skh skjh skjh skjh ksjh ksh skhs kjsh skjh skhs khs kjsh skjh skjhs kshk sjh skjhs kjsh skjh skjh ksj ksjh jsk hskjh s</p><p>jshjksh skjhs jksh skjhsj ksh jkshs kjhs kjsh sjkhs khs ksh skh skh skjh&#13; 
skjh skjh ksjh ksh skhs kjsh skjh skhs khs kjsh skjh skjhs kshk sjh &#13; 
skjhs kjsh skjh skjh ksj ksjh jsk hskjh s</p></body></html> 

i verilen çözüm çalıştırdığınızda oluyor whats aşağıda örnek olarak p etiketlerinde içinde yer almaktadır, bir etiket paragrafın biten sonra ekleniyor kapanış.

imgs = tree.xpath('.//img') 
thm = "new-value" 
for img in imgs: 
    img.set('src', thm) 
    a = etree.Element('a', href="#") 
    img.addprevious(a) 
    a.insert(0, img) 

Ayrıca

>>> etree.tostring(tree) 
'<html><body><a href="#"><img src="new-value"/></a></body></html>' 

, lxml.html.fragment_fromstring yararlı olabilir sonuçlanacaktır O ancak örneğinde olduğu gibi, daha çeşitli örnek sağlamak zorunda:

+1

harika Şimdi 'LXML' kullanmaya başladığınıza. Http://stackoverflow.com/questions/20595735/python-regular-expression-find-and adresinde yer alan "src" değerini değiştirmek için sorununuzu çözdüğünüzden bu fikri/bilgiyi nereden aldığınıza dair cevabı kabul edebilir misiniz? -replace-html-tag-ile-özgü-nitelik-valu/20629768 # 20629768 I just did – Jon

+1

, teşekkür jon :) .. girişinizi hızlı cevap için –

cevap

3

Sen ekin önce addprevious kullanabilirsiniz tek başına görüntü öğesinin, xpath tarafından bulunmaz.

aşağıdaki demo izleyin: img etiketi kuyruğu vardır olduğunda durumlar için

>>> import lxml.html 
>>> img = lxml.html.fragment_fromstring('<img src="old-value" />') 
>>> thm = "new-value" 
>>> img.set('src', thm) 
>>> a = etree.Element('a', href="#") 
>>> a.insert(0, img) 
>>> lxml.html.etree.tostring(a) 
'<a href="#"><img src="new-value"/></a>' 

Güncelleme

, oluşturduğunuz a etiketine yeniden atayabilirsiniz:

>>> s = '<html><body><p><img src="old_value"/>some text</p></body></html>' 
>>> tree = etree.HTML(s) 
>>> imgs = tree.xpath('.//img') 
>>> thm = "new-value" 
>>> for img in imgs: 
...  img.set('src', thm) 
...  a = etree.Element('a', href="#") 
...  img.addprevious(a) 
...  a.insert(0, img) 
...  a.tail = img.tail 
...  img.tail = '' 
... 
>>> etree.tostring(tree) 
'<html><body><p><a href="#"><img src="new-value"/></a>some text</p></body></html>' 
+0

sayesinde addprevious yaptığımız çalışmalar takdir .. ama eklemez görüntüden sonra kapanış etiketi? Benim içinimg –

+0

@MoJ sonra alıyorum.Mughrabi eklemek zorunda * ve * yeni ('') eleman eklemek, benim cevabım – alko

+0

sadece örnekleri güncelledim, sorunu html kendisi, sorunu çözülmüş olan p etiketi içinde yer almaktadır –

0
holder = etree.Element('div', {'id': 'links'}) 
for img in imgs: 
    a_tag = etree.SubElement(holder, {'href':'#'}) 
    img_tag = etree.SubElement(a_tag, {'src': 'new_value'}) 

etree.toString(holder)