मेरे पास एक वेबसाइट है और उनका लेआउट मूल रूप से यह है:

<h2>
    First Heading
</h2>
<h2>
    <span class="class" id="id1">Second Heading</span>
</h2>
<ul>
    <li>One</li><li>Two</li><li>Three</li><li>Four</li><li>Five</li>
</ul>
<h2>
    <span class="class" id="id2">Third Heading</span>
</h2>
<ul>
    <li>Red</li><li>Orange</li><li>Yellow</li><li>Green</li><li>Blue</li>
</ul>
<h2>
    <span class="class" id="id3">Last Heading</span>
</h2>
<ul>
    <li>VVV</li><li>WWW</li><li>XXX</li><li>YYY</li><li>ZZZ</li>
</ul>

मैं दूसरे शीर्षक और तीसरे शीर्षक के बीच से सूची आइटम कैसे प्राप्त करूं?

मैंने इसके साथ कुछ इस तरह से विचार करके शुरुआत की:

h2s = soup.find_all("h2")

for h2 in h2s:
    print(h2.span)

और फिर मैं कुछ इस तरह आगे बढ़ा:

startSpan = soup.find("span", id="id1")
stopSpan = soup.find("span", id="id2")

और इसके माध्यम से पुनरावृति के बारे में सोचा, लेकिन यह सब एक साथ रखने के लिए संघर्ष कर रहा हूं।

आखिरकार मैं जो हासिल करने की कोशिश कर रहा हूं वह है:

["One", "Two", "Three"...]

पृष्ठ के नीचे अन्य सूचियों को शामिल किए बिना।

1
user15133383 3 फरवरी 2021, 00:44
यदि HTML को इस प्रकार स्वरूपित किया जाता है, तो क्या soup.find('ul') इस स्थिति में अपेक्षानुसार काम नहीं करेगा? अगर इससे पहले कुछ भी नहीं है, तो वह केवल पहले पाए गए ul को खींच लेगा
 – 
Wondercricket
3 फरवरी 2021, 00:51
ऐसा लगता है कि मुझे जिस सामग्री की आवश्यकता है, उससे पहले एक ul है जो मुझसे छूट गया है। तो यह वास्तव में दूसरा ul है जिसे मुझे प्राप्त करने की आवश्यकता है।
 – 
user15133383
3 फरवरी 2021, 00:59

1 उत्तर

सबसे बढ़िया उत्तर
  1. <h2> टैग खोजें >:nth-of-type(n) CSS चयनकर्ता।
  2. <ul> टैग खोजें "nofollow noreferrer">.find_next() विधि।
soup = BeautifulSoup(html, "html.parser")

print(
    soup.select_one("h2:nth-of-type(2)")
    .find_next("ul")
    .get_text(strip=True, separator="|")
    .split("|")
)

आउटपुट:

['One', 'Two', 'Three', 'Four', 'Five']

"ईवेंट" के अंतर्गत सभी <li> टैग चुनने के लिए संपादित करें:

for tag in soup.select(".mw-parser-output > ul:nth-of-type(1) li"):
    print(tag.text)
0
MendelG 8 फरवरी 2021, 22:04
यह निश्चित रूप से काम करना चाहिए, और यह ऊपर वर्णित उदाहरण स्निपेट पर काम करता है। वास्तविक दुनिया में ऐसा क्या गलत हो रहा है कि मुझे "ईवेंट" नहीं मिल रहा है? import requests from bs4 import BeautifulSoup URL = 'https://en.wikipedia.org/wiki/December_31' html = requests.get(URL) soup = BeautifulSoup(html.text, "html.parser") print(soup.select_one("h2:nth-of-type(1)")) # Returns "Contents", the 1st header print(soup.select_one("h2:nth-of-type(2)")) # Returns "Births", the 3rd header # One of those should return "Events" which is the one I care about
 – 
user15133383
3 फरवरी 2021, 02:05
यह पृष्ठ के मार्कअप पर आधारित है। सबसे आसान तरीका है सीएसएस चयनकर्ता को कॉपी करना (क्रोम में। right-click -> Inspect -> Click on the element you want -> Right-click -> Copy -> Copy Selector
 – 
MendelG
3 फरवरी 2021, 02:18
मैंने Events के अंतर्गत सभी तत्वों का चयन करने के लिए अपना उत्तर संपादित कर लिया है।
 – 
MendelG
3 फरवरी 2021, 02:19