केवल कुछ विशेषताओं के साथ टैग कैसे खोजें - सुंदरसुपर


85

मैं सुंदरसौप का उपयोग कैसे करूंगा, केवल उन विशेषताओं के लिए खोज करता हूं जिनके लिए मैं खोजता हूं?

उदाहरण के लिए, मैं सभी <td valign="top">टैग ढूंढना चाहता हूं ।

निम्नलिखित कोड: raw_card_data = soup.fetch('td', {'valign':re.compile('top')})

मैं चाहता हूँ कि सभी डेटा मिल जाता है, लेकिन यह भी <td>विशेषता है कि किसी भी टैग पकड़ लेता हैvalign:top

मैंने भी कोशिश की: raw_card_data = soup.findAll(re.compile('<td valign="top">')) और यह कुछ भी नहीं लौटा (शायद खराब रेगेक्स की वजह से)

मैं सोच रहा था कि क्या एक सुंदर तरीके से कहने के लिए " <td>टैग खोजें जिसका एकमात्र गुण है valign:top"

अद्यतन उदाहरण के लिए, यदि एक HTML दस्तावेज़ में निम्नलिखित <td>टैग शामिल हैं:

<td valign="top">.....</td><br />
<td width="580" valign="top">.......</td><br />
<td>.....</td><br />

मैं केवल पहला <td>टैग ( <td width="580" valign="top">) वापस करना चाहता हूं

जवाबों:


97

जैसा कि सुंदरसुपर प्रलेखन पर समझाया गया है

आप इसका उपयोग कर सकते हैं:

soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})

संपादित करें:

उन टैगों को वापस करने के लिए जिनके पास केवल valign = "top" विशेषता है, आप टैग attrsप्रॉपर्टी की लंबाई की जांच कर सकते हैं:

from BeautifulSoup import BeautifulSoup

html = '<td valign="top">.....</td>\
        <td width="580" valign="top">.......</td>\
        <td>.....</td>'

soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})

for result in results :
    if len(result.attrs) == 1 :
        print result

वह रिटर्न:

<td valign="top">.....</td>

Julio.alegria पर मेरी टिप्पणी के अनुसार, इस <tr>विशेषता के साथ सभी टैग मिल जाएंगे valign="top", जिनमें अन्य विशेषताएँ <td width="580" valign="top">भी हैं ( यह इस खोज में भी लौटा है) मैं उन <tr>टैगों को खोजने के लिए एक विधि की तलाश कर रहा हूं, जिसका एकमात्र गुण हैvalign="top"
स्नैक्सिब

तो, आप len (tag.attrs) चेक कर सकते हैं। अगर len (tag.attrs)> 1, टैग को अनदेखा करें (मैंने अपना पोस्ट संपादित कर दिया है)
Loïc G.

51

आप प्रलेखन में बताए अनुसार lambdaकार्यों का उपयोग कर सकते हैं । ताकि आपके मामले में केवल उपयोग के साथ टैग की खोज हो सके :findAlltdvalign = "top"

td_tag_list = soup.findAll(
                lambda tag:tag.name == "td" and
                len(tag.attrs) == 1 and
                tag["valign"] == "top")

4
सर्वोत्तम उत्तर के रूप में यह बीएस की पूरी शक्ति का उपयोग करता है
राफेल टी

2
शानदार उत्तर क्योंकि यह आपको बहुत ही अनुकूलित तरीके से परिणाम देता है।
क्रेजीगीक

32

यदि आप किसी भी मान के साथ केवल विशेषता नाम के साथ खोज करना चाहते हैं

from bs4 import BeautifulSoup
import re

soup= BeautifulSoup(html.text,'lxml')
results = soup.findAll("td", {"valign" : re.compile(r".*")})

स्टीव लोरिमर के अनुसार रेगेक्स के बजाय ट्रू पास करना बेहतर है

results = soup.findAll("td", {"valign" : True})

2
आपको बाद में एक कोष्ठक याद आ रहा है r".*", जिसके परिणामस्वरूप यह संकलन नहीं है।
जैक कोल

9
एक नियमित अभिव्यक्ति के लिए कोई ज़रूरत नहीं है, बस पास True:results = soup.findAll("td", {"valign" : True})
स्टीव लोरिमर


4

बस इसे एक तर्क के रूप में पास करें findAll:

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("""
... <html>
... <head><title>My Title!</title></head>
... <body><table>
... <tr><td>First!</td>
... <td valign="top">Second!</td></tr>
... </table></body><html>
... """)
>>>
>>> soup.findAll('td')
[<td>First!</td>, <td valign="top">Second!</td>]
>>>
>>> soup.findAll('td', valign='top')
[<td valign="top">Second!</td>]

1
यदि ऐसा है तो टैग क्या हैं <td width="580" valign="top">:? मैं उन लोगों को नहीं valign="top"
पकड़ना

2

क्रिस रेडफोर्ड और अम्र के उत्तर के संयोजन को जोड़कर, आप चुनिंदा कमांड के साथ किसी भी मान के साथ एक विशेषता नाम भी खोज सकते हैं:

from bs4 import BeautifulSoup as Soup
html = '<td valign="top">.....</td>\
    <td width="580" valign="top">.......</td>\
    <td>.....</td>'
soup = Soup(html, 'lxml')
results = soup.select('td[valign]')

मैंने उसी तरह की कोशिश की है, लेकिन यह काम नहीं कर रहा है, क्या कोई वर्कअराउंड है?
फणीन्द्र चार्युलु कंदूरी

1
@PhaneendraCharyuluKanduri क्षमा करें, कोड में एक खराब कोडिंग त्रुटि थी। अब कॉपी और पेस्ट काम करना चाहिए!
ग्राज़िंग साइंटिस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.