दिलचस्प पोस्ट
अजगर में खुले () अगर वह मौजूद नहीं है तो फाइल नहीं बनायी जाती है एकल सूची के लिए सूची की लिनक सूची स्प्रिंग एमवीसी के देखने की तकनीक के रूप में JSF का उपयोग करना व्यूपोर्ट ओरिएंटेशन का पता लगाएं, यदि ओरिएंटेशन पोर्ट्रेट डिस्प्ले चेतावनी संदेश है जो उपयोगकर्ता के निर्देशों को सलाह देता है .NET फ्रेमवर्क, सीएलआर और विजुअल स्टूडियो संस्करण संख्याएं एक-दूसरे से कैसे संबंधित हैं? लंबे पाठ इनपुट के बहुत दाईं ओर "स्क्रॉल करें" क्यों सब कुछ के लिए HTTPS का उपयोग नहीं? जैक्सन – कैसे प्रक्रिया (deserialize) नेस्टेड JSON? jQuery। त्रुटि प्रतिक्रिया समारोह जाओ? मौजूदा मंडली पर वक्र पाठ मैं पीपी के साथ एक स्थानीय कैश से कैसे स्थापित करूं? localStorage – getItem / setItem फ़ंक्शंस का उपयोग करें या ऑब्जेक्ट सीधे एक्सेस करें? JSF फेसलेट: कभी-कभी मुझे यूआरएल .jsf और कभी-कभी .xhtml दिखता है। क्यूं कर? क्यों jQuery $। Fn.data () में परिवर्तन नहीं करते हैं, इसी html 5 डेटा- * विशेषताओं को अपडेट करें? आर में फ़ाइल करने के लिए सभी कंसोल आउटपुट को कैसे सहेजना है?

यौगिक वर्ग के नामों के द्वारा खोज करते समय सुंदर सूप खाली सूची देता है

सुंदर सेप रिजक्स का उपयोग करते हुए मिश्रित वर्ग नामों द्वारा खोज करते समय रिक्त सूची लौटाता है।

उदाहरण:

import re from bs4 import BeautifulSoup bs = """ <a class="name-single name692" href="www.example.com"">Example Text</a> """ bsObj = BeautifulSoup(bs) # this returns the class found_elements = bsObj.find_all("a", class_= re.compile("^(name-single.*)$")) # this returns an empty list found_elements = bsObj.find_all("a", class_= re.compile("^(name-single name\d*)$")) 

मुझे कक्षा चयन बहुत सटीक होना चाहिए कोई विचार?

Solutions Collecting From Web of "यौगिक वर्ग के नामों के द्वारा खोज करते समय सुंदर सूप खाली सूची देता है"

दुर्भाग्य से, जब आप एक क्लास विशेषता मान पर एक नियमित अभिव्यक्ति मैच बनाने की कोशिश करते हैं जिसमें एकाधिक वर्ग होते हैं, तो BeautifulSoup नियमित अभिव्यक्ति को प्रत्येक वर्ग से अलग से लागू करते हैं। इस समस्या के बारे में प्रासंगिक विषय यहां दिए गए हैं:

  • सुंदर सूप के लिए अजगर का नियमित अभिव्यक्ति
  • एकाधिक सीएसएस वर्ग खोज अनहंड है

यह सब इसलिए है क्योंकि class एक बहुत ही विशिष्ट बहु मूल्य विशेषता है और हर बार जब आप HTML को विश्लेषित करते हैं, तो सुंदरसूप के पेड़ के बिल्डरों में से एक (पारसर विकल्प के आधार पर) आंतरिक रूप से क्लास स्ट्रिंग मान को कक्षाओं की सूची में विभाजित करता है (उद्धरण HTMLTreeBuilder ):

 # The HTML standard defines these attributes as containing a # space-separated list of values, not a single value. That is, # class="foo bar" means that the 'class' attribute has two values, # 'foo' and 'bar', not the single value 'foo bar'. When we # encounter one of these attributes, we will parse its value into # a list of values if possible. Upon output, the list will be # converted back into a string. 

कई कार्यवाही हैं, लेकिन यह एक हैक-इश है- हम BeautifulSoup को पूछने जा रहे हैं कि हमारे सरल कस्टम पेड़ बिल्डर के द्वारा class को बहु-मूल्यवान विशेषता के रूप में संभालना न हो:

 import re from bs4 import BeautifulSoup from bs4.builder._htmlparser import HTMLParserTreeBuilder class MyBuilder(HTMLParserTreeBuilder): def __init__(self): super(MyBuilder, self).__init__() # BeautifulSoup, please don't treat "class" specially self.cdata_list_attributes["*"].remove("class") bs = """<a class="name-single name692" href="www.example.com"">Example Text</a>""" bsObj = BeautifulSoup(bs, "html.parser", builder=MyBuilder()) found_elements = bsObj.find_all("a", class_=re.compile(r"^name\-single name\d+$")) print(found_elements) 

इस मामले में नियमित अभिव्यक्ति को एक class एट्रिब्यूट मान पर एक पूरे के रूप में लागू किया जाएगा।


वैकल्पिक रूप से, आप बस xml सुविधाओं के साथ HTML को पार्स कर सकते हैं (यदि यह लागू है):

 soup = BeautifulSoup(data, "xml") 

आप सीएसएस चयनकर्ताओं का उपयोग भी कर सकते हैं और name-single वर्ग और "नाम" से घूर एक वर्ग के साथ सभी तत्वों से मेल खा सकते हैं:

 soup.select("a.name-single,a[class^=name]") 

यदि आवश्यक हो तो आप नियमित अभिव्यक्ति मैन्युअल रूप से लागू कर सकते हैं:

 pattern = re.compile(r"^name-single name\d+$") for elm in bsObj.select("a.name-single,a[class^=name]"): match = pattern.match(" ".join(elm["class"])) if match: print(elm) 

इस उपयोग के मामले में मैं बस एक कस्टम फ़िल्टर का प्रयोग करता हूं, जैसे:

 import re from bs4 import BeautifulSoup from bs4.builder._htmlparser import HTMLParserTreeBuilder def myclassfilter(tag): return re.compile(r"^name\-single name\d+$").search(' '.join(tag['class'])) bs = """<a class="name-single name692" href="www.example.com"">Example Text</a>""" bsObj = BeautifulSoup(bs, "html.parser") found_elements = bsObj.find_all(myclassfilter) print(found_elements)