2009-09-05 11 views
6

मैं सुंदर HTML से lxml तक कुछ HTML पार्सिंग कोड परिवर्तित कर रहा हूं। मैं निम्नलिखित BeautifullSoup बयान के लिए lxml बराबर वाक्य रचना यह पता लगाने की कोशिश कर रहा हूँ:एलसीएमएल सुंदर सूप के बराबर "या" वाक्यविन्यास?

soup.find('a', {'class': ['current zzt', 'zzt']}) 

असल में मैं दस्तावेज़ में "एक" टैग या तो "वर्तमान Zzt" का एक वर्ग विशेषता है कि सब पता लगाना चाहते हैं या "zzt"। सुंदर सूप मैच को करने के लिए एक सूची, शब्दकोश, या यहां तक ​​कि एक नियमित एक्सप्रेस में प्रवेश करने की अनुमति देता है।

एलएक्सएमएल समकक्ष क्या है?

धन्यवाद!

+0

मुझे लगता है कि xpath expr होना चाहिए: '// a [@ class = 'current zzt' या @ class = 'zzt'' – tonfa

+0

(अंत में यह एक अनुपलब्ध है) – tonfa

+0

यह काम करता है- लेकिन यह एक सूची देता है (जैसे findall() होगा)। इसे खोजने के लिए कोई तरीका खोजने के लिए()? (अंत में एक [0] से निपटने के बिना?) – erikcw

उत्तर

3

नहीं, एलएक्सएमएल "पहले ढूंढें या वापस लौटें" विधि प्रदान नहीं करता है जिसे आप ढूंढ रहे हैं। अगर आपको इसकी आवश्यकता है तो बस (select(soup) or [None])[0] का उपयोग करें, या आपके लिए ऐसा करने के लिए एक फ़ंक्शन लिखें।

#!/usr/bin/python 
import lxml.html 
import lxml.cssselect 
soup = lxml.html.fromstring(""" 
     <html> 
     <a href="foo" class="yyy zzz" /> 
     <a href="bar" class="yyy" /> 
     <a href="baz" class="zzz" /> 
     <a href="quux" class="zzz yyy" /> 
     <a href="warble" class="qqq" /> 
     <p class="yyy zzz">Hello</p> 
     </html>""") 

select = lxml.cssselect.CSSSelector("a.yyy.zzz, a.yyy") 
print [lxml.html.tostring(s).strip() for s in select(soup)] 
print (select(soup) or [None])[0] 

ठीक है, तो soup.find('a') वास्तव में पहली बार एक तत्व या कोई नहीं लगता है के रूप में आप उम्मीद करेंगे। समस्या यह है कि यह सीएसएस चयनकर्ता के लिए आवश्यक समृद्ध XPath वाक्यविन्यास का समर्थन नहीं करता है।

संबंधित मुद्दे