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


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.