Assuming html source are as follows:
<html><body>
<div class="aname">
<div class="bname">
<h5><a href="url_a0" class="cname">aTitle</a></h5>
</div>
<div class="">
<div><img src="url_a1"/>img_text<br /></div>
<div><strong>label_a1:</strong>text_a1<br /></div>
<div><strong>label_a2:</strong>text_a2<br /></div>
<div><strong>label_spe:<a href="url_a2">*</a>:</strong>
<span class="box-span" >spantext_a1</span>
<span class="box-span" >spantext_a2</span>
<span class="box-span" >spantext_a3</span><br />
</div>
</div>
</div>
<div class="aname">
<div class="bname">
<h5><a href="url_a0" class="cname">aTitle</a></h5>
</div>
<div class="">
<div><img src="url_a1"/>img_text<br /></div>
<div><strong>label_a1:</strong>text_b1<br /></div>
<div><strong>label_a2:</strong>text_b2<br /></div>
<div><strong>label_a3:</strong>text_b3<br /></div>
<div><strong>label_spe:<a href="url_b3">*</a>:</strong>
<span class="box-span" >spantext_b1</span>
<span class="box-span" >spantext_b2</span>
<span class="box-span" >spantext_b3</span>
<span class="box-span" >spantext_b4</span>
<span class="box-span" >spantext_b5</span>
<span class="box-span" >spantext_b6</span><br />
</div>
</div>
</div>
</body></html>
if I want the output are:
aTitle
url_a0
label_a1:
text_a1
label_a2:
text_a2
label_spe:
spantext_a1
spantext_a2
spantext_a3
aTitle
url_a0
label_a1:
text_b1
label_a2:
text_b2
label_a3:
text_b3
label_spe:
spantext_b1
spantext_b2
spantext_b3
spantext_b4
spantext_b5
spantext_b6
I want to use lxml with python!! Please help me, What should I do? Since html have more than one div, and the number of span are variable. I have try so many times, but still can't get the right output. Finally, I hope I can get some useful info from here!! My code are as below:
# -*- coding:utf-8 -*-
import codecs
import lxml,re
import re
from lxml import etree
from lxml.html.clean import Cleaner
def main():
pass
if __name__ == '__main__':
main()
ff = codecs.open('test.html','r',errors='ignore',encoding='utf-8')
html0 = ff.read()
html1 = re.sub('<strong>', '',html0)
html2 = re.sub('</strong>','',html1)
html = re.sub('class=\"box-span\"','',html2)
spelabels = ['img_text', 'label_a1', 'label_a2', 'label_a3']
root = lxml.html.fromstring(html)
contents = root.xpath('.//div[@class="aname"]/div[@class=""]/div/text()')
for content in contents:
if content[0:8] in spelabels:
print(content[0:8])
print(content[9:])
elif content == "label_spe:":
print(content)
nestedcontents = root.xpath('.//div[@class="aname"]/div[@class=""]/div[text()="label_spe:"]/following-sibling::span/text()')
print(nestedcontents)
for nestedcontent in nestedcontents:
print(nestcontent)
the output:
img_text
label_a1
text_a1
label_a2
text_a2
label_spe:
[]
img_text
label_a1
text_b1
label_a2
text_b2
label_a3
text_b3
label_spe:
[]
It seems partly work, but I don't know how to extract the url_a1. The text in span does not appear"
ff = codecs.open('test.html',mode='r',errors='ignore',encoding='utf-8') html = ff.read() body = etree.parse(html).find('body')
, but it appears error === > Traceback (most recent call last): File "