XPath

2016-03-19 24 views
1

kullanarak kalın etiketin ardından metni ayrıştırma Python'da Xpath kullanarak metin alıyorum. metnin yapısı aşağıdaki gibidir:XPath

<b>Field1:</b>" Value1" <br> 
<b>Field2:</b>" Value2" <br><br> 
<b>Field3:</b>" Value3" <br><br> 
<b>Field4:</b>" Value4" <br> 
<b>Field5:</b>" Value5" <br><br> 

Not satır sonu (br etiketi) bu numarayı ayıklamak istiyorum

tutarsız olabilir:

Field 1: Value 1 
Field 2: Value 2 
Field 3: Value 3 
Field 4: Value 4 
Field 5: Value 5 

anda benim XPath// b/text() Alanları ayıklamakta, ancak Değerleri değil.

Lütfen

Yardım edin.

+0

ValueX herhangi bir etikete bağlı değil? –

+0

@PankajKatiyar no, herhangi bir etikete bağlanmadı – Ram

cevap

2

Sen BeautifulSoup HTML ayrıştırıcı ile bunu çözebilir ve .next_sibling var:

from bs4 import BeautifulSoup 

data = """ 
<div> 
<b>Field1:</b>" Value1" <br> 
<b>Field2:</b>" Value2" <br><br> 
<b>Field3:</b>" Value3" <br><br> 
<b>Field4:</b>" Value4" <br> 
<b>Field5:</b>" Value5" <br><br> 
</div> 
""" 
soup = BeautifulSoup(data, 'html.parser') 

for b in soup.find_all("b"): 
    label = b.get_text(strip=True) 
    value = b.next_sibling.strip() 

    print(label, value) 

Veya lxml.html ile ve following-sibling ekseni: Eğer lxml kullandığınız

from lxml.html import fromstring 

data = """ 
<div> 
<b>Field1:</b>" Value1" <br> 
<b>Field2:</b>" Value2" <br><br> 
<b>Field3:</b>" Value3" <br><br> 
<b>Field4:</b>" Value4" <br> 
<b>Field5:</b>" Value5" <br><br> 
</div> 
""" 

root = fromstring(data) 
for b in root.xpath("//b"): 
    label = b.text_content() 
    value = b.xpath("following-sibling::text()")[0].strip() 

    print(label, value) 
+0

[0] .strip() bir "IndexError: liste dizini aralık dışı" istisnası atıyor ama onu kaldırdığımda çalışır. – Ram

+0

@Ram ah, evet, her b' etiketinin aşağıdaki metin kardeşinin olduğunu varsayıyordum - bu sizin giriş verileriniz için geçerli olmayabilir. – alecxe

+0

2 çözüm sağladığınız için teşekkür ederiz. BeautifulSoup çok daha zarif görünüyor. – Ram

2

varsayarsak, metin alabilirsiniz tail özniteliği kullanarak öğeyi izler:

>>> import lxml.html 
>>> 
>>> root = lxml.html.fromstring(''' 
... <html> 
...  <body> 
...   <b>Field1:</b>" Value1" <br> 
...   <b>Field2:</b>" Value2" <br><br> 
...   <b>Field3:</b>" Value3" <br><br> 
...   <b>Field4:</b>" Value4" <br> 
...   <b>Field5:</b>" Value5" <br><br> 
...  </body> 
... </html> 
... ''') 
>>> for b in root.xpath('//b'): 
...  print('{} {}'.format(b.text, b.tail.strip('" '))) # <--- 
... 
Field1: Value1 
Field2: Value2 
Field3: Value3 
Field4: Value4 
Field5: Value5 
+0

Çözüm sağladığınız için teşekkür ederiz. – Ram