ruby - Parse HTML with Nokogiri and get text with the closest "" -


मेरे पास एचटीएमएल युक्त है:

  & lt; div class = "s" & gt; & Lt; p & gt; पाठ 1 & lt; / p & gt; & lt; div class = "i" & gt; & Lt; p & gt; पाठ 2 & lt; / p & gt; & Lt; / div & gt; & Lt; / div & gt;   

मुझे कक्षा "s" के साथ निकटतम & lt; div & gt; के साथ सभी लेख प्राप्त करने की आवश्यकता है।

उदाहरण के लिए, मैं प्राप्त करने की कोशिश कर रहा हूं:

  सरणी = [] html.css ("s")। प्रत्येक do | element | सरणी & lt; & lt; Element.text.strip end   

यह सब अच्छा है, सिवाय इसके कि मेरे सरणी में "text2" प्रकट होता है, और मुझे यह नहीं चाहिए तो "text2" के लिए, सबसे निकटतम

gt; वर्ग "i" था, और मैं इसे मेरी सरणी में नहीं देखना चाहता ।

मैं इसका समाधान कैसे कर सकता हूं? उदाहरण के लिए: विभिन्न वर्ग के नाम और गहरी घोंसले के शिकार हो सकते हैं:

  & lt; div class = "s" & gt; & Lt; p & gt; पाठ 1 & lt; / p & gt; & Lt; div class = "i" & gt; & Lt; p & gt; पाठ 2 & lt; / p & gt; & Lt; div वर्ग = "s" & gt; & Lt; p & gt; पाठ 3 & lt; / p & gt; & lt; div class = "p" & gt; & Lt; p & gt; टेक्स्ट 4 & lt; / p & gt; & Lt; / div & gt; & Lt; / div & gt; & Lt; / div & gt; & Lt; / div & gt;   

इस से, मैं इस पर एक सरणी प्राप्त करना चाहता हूं: ["text1", "text3"]

< Div class = "post-text" itemprop = "text">

अपडेट: बेहतर xpath-only उत्तर मेरा मूल उत्तर नीचे है।

  # एक `नोकोगीरी :: HTML दस्तावेज़ को` html` चर में दिये गये: html.xpath ("// text () [normalize-space ()) और पूर्वज: : Div [1] [@ वर्ग = 'एस']] ")। नक्शा (और: पाठ) .मैप (और: पट्टी)   

यह सिर्फ सभी रिक्त स्थान को पाता है पाठ नोड जिसका निकटतम div पूर्वज का s वर्ग है यह मेरे मूल उत्तर के समान है, सिवाय यह पूरी तरह से XPath में किया जाता है।

  & lt; div class = "s" & gt; & Lt; p & gt; पाठ 1 & lt; / p & gt; & lt; div class = "i" & gt; & Lt; p & gt; पाठ 2 & lt; / p & gt; & Lt; / div & gt; & Lt; / div & gt; # = & Gt; ["Text1"] & lt; div वर्ग = "s" & gt; & Lt; p & gt; पाठ 1 & lt; / p & gt; & lt; div class = "i" & gt; & Lt; p & gt; पाठ 2 & lt; / p & gt; & Lt; div वर्ग = "s" & gt; & Lt; p & gt; पाठ 3 & lt; / p & gt; & lt; div class = "p" & gt; & Lt; p & gt; टेक्स्ट 4 & lt; / p & gt; & Lt; / div & gt; & Lt; / div & gt; & Lt; / div & gt; & Lt; / div & gt; # = & Gt; ["पाठ 1", "पाठ 3"] & lt; div class = "s" & gt; & lt; div वर्ग = 'पी' & gt; पाठ 1 & lt; / div & gt; पाठ 2 & lt; / div & gt; # = & Gt; ["पाठ 2"]   

मूल उत्तर:

  html.search ("// div [@ class = 's'] / / पाठ () ")। {| T | चुनें टी। डिस्टेस्टर्स ("डिवि")। पहले.ट्रैट ("क्लास") == "s"} मानचित्र (और: पाठ) .join.squeeze.strip # = & gt; "Text1"   

यहां मूल विचार यह है कि हम सभी टेक्स्ट नोड पाते हैं जो div.s से उतरते हैं और निकटतम div प्रत्येक पाठ नोड के लिए पूर्वज, और केवल नोड्स को स्वीकार करते हैं जिनके पास s की एक कक्षा के साथ निकटतम डिवेल पूर्वज हैं। यह थोड़ा सीपीयू-गहन है, लेकिन यह कठोर आवश्यकताओं को पूरा करता है ।

Comments

Popular posts from this blog

php - PDO bindParam() fatal error -

logging - How can I log both the Request.InputStream and Response.OutputStream traffic in my ASP.NET MVC3 Application for specific Actions? -

java - Why my included JSP file won't get processed correctly? -