2012-11-25 17 views
5

का उपयोग करके विकल्प टेक्स्ट कैसे प्राप्त करें I निम्नलिखित HTML में विकल्प टेक्स्ट प्राप्त करने के लिए सुंदर सूप का उपयोग करना चाहता हूं। उदाहरण के लिए: मैं 2002/12, 2003/12 आदि प्राप्त करना चाहता हूंसुंदर सूप

<select id="start_dateid"> 
<option value="0">2002/12</option> 
<option value="1">2003/12</option> 
<option value="2">2004/12</option> 
<option value="3">2005/12</option> 
<option value="4">2006/12</option> 
<option value="5" selected="">2007/12</option> 
<option value="6">2008/12</option> 
<option value="7">2009/12</option> 
<option value="8">2010/12</option> 
<option value="9">2011/12</option> 
</select> 

सामग्री प्राप्त करने का सबसे अच्छा तरीका क्या है? अब मैं निम्नलिखित कोड का उपयोग कर रहा हूं लेकिन मुझे नहीं पता कि इसके लिए सुंदर सूप का उपयोग कैसे करें। यदि HTML फ़ाइल में एक से अधिक चयनित क्षेत्र हैं, तो परिणाम गलत होगा। यहां मेरे पास अब तक है:

import urllib2 
    from bs4 import BeautifulSoup 
    import lxml 

    soup = BeautifulSoup(urllib2.urlopen("./test.html").read(),"lxml"); 
    for item in soup.find_all('option'): 
      print(''.join(str(item.find(text=True)))); 

उत्तर

13

आपको यहां lxml का उपयोग करने की आवश्यकता नहीं है। मुझे अपनी मशीन पर इसे स्थापित करने में परेशानी है, इसलिए मेरा जवाब इसका उपयोग नहीं करता है।

from bs4 import BeautifulSoup as BS 
import urllib2 

soup = BS(urllib2.urlopen("./test.html").read()) 
contents = [str(x.text) for x in soup.find(id="start_dateid").find_all('option')] 
इस के साथ

, आप html फ़ाइल में एक से अधिक चयनित क्षेत्रों की समस्या से बचने के बाद से हम पहले, id='start_dateid' द्वारा सीमित कर रहे हैं जो आपके लिए गारंटी देता है कि आप सही <select> है, प्रत्येक html दस्तावेज़ प्रत्येक html के भीतर के बाद से यदि आपके पास id विशेषता है तो तत्व में एक अद्वितीय id विशेषता होनी चाहिए। फिर, हम सभी <option> टैग केवल के भीतर खोज रहे हैं<select> टैग, और फिर हम प्रत्येक <option> से सभी मान प्राप्त करते हैं।

1

बस, बजाय select टैग का चयन करें तो निहित स्ट्रिंग तत्वों से अधिक पाश:

import urllib2 
from bs4 import BeautifulSoup 
import lxml 

soup = BeautifulSoup(urllib2.urlopen("./test.html").read(),"lxml"); 
select = soup.find('select', id="start_dateid") 
for value in select.stripped_strings: 
    print value 

यह एक मामूली शॉर्टकट है; इसके बजाय आप select.find_all('option') से अधिक लूप कर सकते हैं और प्रत्येक से .text संपत्ति प्राप्त कर सकते हैं, लेकिन चूंकि कोई अन्य तत्व मौजूद नहीं है, फिर भी स्ट्रिंग के लिए सीधे क्यों न जाएं और इसके साथ किया जाए। आखिरकार, <option> और <optgroup> टैग <select> टैग में अनुमत हैं, और केवल <option> टैग टेक्स्ट धारण करते हैं। इंटरैक्टिव दुभाषिया से

आउटपुट:

>>> select = soup.find('select', id="start_dateid") 
>>> for value in select.stripped_strings: 
...  print value 
... 
2002/12 
2003/12 
2004/12 
2005/12 
2006/12 
2007/12 
2008/12 
2009/12 
2010/12 
2011/12 

आप एक सूची में इस चालू करने की आवश्यकता है, तो बस का उपयोग करें:

values = list(select.stripped_strings) 
+0

'stripped_strings' जवाब समस्याएं खड़ी कर सकता है, तो देखते हैं गैर'