2012-01-29 19 views
5

href मैं इस तरह से एचटीएमएल से सभी href चयन करने के लिए BeautifulSoup मॉड्यूल का उपयोग कर रहा:पायथन मॉड्यूल BeautifulSoup निकालने एंकर

def extract_links(html): 
    soup = BeautifulSoup(html) 
    anchors = soup.findAll('a') 
    print anchors 
    links = [] 
    for a in anchors: 
    links.append(a['href']) 
    return links 

लेकिन कुछ समय यह इस त्रुटि संदेश से विफल रहा है:

Traceback (most recent call last): 
File "C:\py\main.py", line 33, in <module> 
urls = extract_links(page) 
File "C:\py\main.py", line 11, in extract_links 
links.append(a['href']) 
File "C:\py\BeautifulSoup.py", line 601, in __getitem__ 
return self._getAttrMap()[key] 
KeyError: 'href' 

उत्तर

5

नहीं सभी लंगर टैग में एक href विशेषता होगी। इससे पहले कि आप उस विशेषता तक पहुंचने का प्रयास करें, आपको यह जांचना चाहिए कि एंकर का एक href है।

if a.has_key('href') 
    links.append(a['href']) 

यहां कुछ टिप्पणियों की जांच करने के बाद, मुझे लगता है कि यह इस मामले को संभालने का सबसे महत्वपूर्ण तरीका है।

+0

धन्यवाद, लेकिन अब आईआर यह त्रुटि संदेश लौट: फ़ाइल "C: \ py \ मुख्य

अपने उदाहरण और बदलाव ले रहा है, इस कोड है कि काम करता है .py ", लाइन 34, urls = extract_links (पृष्ठ) फ़ाइल" सी: \ py \ main.py ", लाइन 11, extract_links में अगर 'ak' में 'href'(): टाइप एरर: ' NoneType 'ऑब्जेक्ट कॉल करने योग्य नहीं है – Michal

+0

@micheal आप अपने शब्दकोश में' ए' टैग डाल रहे हैं जिसमें 'href' विशेषताएँ नहीं हैं। शब्दकोश को खांसी के लिए शब्दकोश पूछने के बजाय जो 'href' विशेषता दे सकता है या नहीं, डेटा से पूछें * इसे * शब्दकोश में डालने से पहले * करता है। – Droogans

+0

मुझे लगता है कि नई त्रुटि इसलिए है क्योंकि एक सुंदर सूप नोड एक शब्दकोश नहीं है, इसलिए 'कुंजी' वह नहीं है जो आप उम्मीद करते हैं। –

0

pythonic तरीका कुछ इस तरह होगा:

for a in anchors: 
    try: 
     links.append(a['href']) 
    except KeyError: 
     pass 

कि बस एक href के बिना किसी भी <a> टैग को छोड़ देता है।

+1

मुझे लगता है कि 'has_key()' तर्क के लिए त्रुटियों का उपयोग करने से अधिक पाइथोनिक है, लेकिन लोग समुदाय में इसके बारे में असहमत प्रतीत होते हैं। –

+0

@MattLuongo: यह निर्भर करता है कि आप क्या कर रहे हैं। मुझे लगता है कि "प्रत्येक लिंक का पता प्राप्त करें, और यदि उसके पास कोई लिंक नहीं है, तो कभी भी दिमाग न करें" के बजाय यह स्पष्ट रूप से व्यक्त किया गया है कि "प्रत्येक लिंक का पता है या नहीं, और अगर ऐसा होता है, तो उसे प्राप्त करें।" यह मदद नहीं करता है कि 'has_key' को शब्दकोशों के लिए बहिष्कृत किया गया है, लेकिन' इन 'बीएस नोड्स के लिए एक ही काम नहीं करता है। –

+0

मुझे लगता है कि यही कारण है कि 'टैग' 'dict' के वंशज नहीं है। वैसे भी, उस कारण के लिए बहिष्करण बहुत प्रासंगिक नहीं है। –

2

इसे आजमाएं।

links = [a['href'] for a in anchors if a.has_key('href')] 

या, यदि आप बल्कि किसी मौजूदा सूची

links = [] 
#... 
links.extend(a['href'] for a in anchors if a.has_key('href')) 
+0

अच्छा एक-लाइनर। – tjarratt

+0

या, जैसे दस्तावेज़ पसंद करते हैं, 'if' href 'में' :) – Gabriel

+0

@ गैब्रियल दस्तावेज़ इसे पसंद कर सकते हैं, लेकिन इस पर विचार करें। 'एस = सुंदर सूप (' href'); s.findAll में 'href' ('a') [0] '' True' का मूल्यांकन करता है। 'has_key' उस तरह से कमजोर नहीं है। –

0

उत्परिवर्तित हैं तो एक dict पहले a.attrs कास्ट करने के लिए, तो तत्व का उपयोग की जरूरत है।

links.append(dict(a.attrs)['href']) 
+0

एर्म, मुझे लगता है कि आपका मतलब है 'link.append (dict (a.attrs) [' href ']) '..? लेकिन वह उस मामले को संभाल नहीं करता है जहां 'href' के साथ टैग हैं। –

+0

आपका मतलब है * बिना * 'href '? फिर आप सही हैं। मेरा व्यक्तिगत अनुभव दिखाता है कि मुझे कास्ट करने की जरूरत है। – 0605002

+0

हा, * बिना, धन्यवाद। मेरा मतलब था कि उपर्युक्त कोड 'a.attrs' को' dict 'में नहीं डाला गया है, यह' a.attrs ['href'] '' dict 'तक है, जो' TypeError' उठाता है। –

2

soup.findAll() "टैग", जो विशेषताओं के शब्दकोशों में होते हैं की एक सूची देता है। तो आपको इसकी विशेषताओं को निकालने और उन पर काम करने की आवश्यकता है। ट्रैसबैक (सबसे हाल कॉल पिछले):

def extract_links(html): 
    soup = BeautifulSoup(html) 
    anchors = soup.findAll('a') 
    print anchors 
    links = [] 
    for a in anchors: 
    if a.attrs.has_key('href'): 
     links.append(a['href']) 
return links 
संबंधित मुद्दे