2013-03-14 5 views
2

저는 BeautifulSoup 및 Requests API를 가지고 놀고있었습니다. 그래서 저는 깊이 2에 대한 링크를 따르는 간단한 긁는 도구를 쓸 것이라고 생각했습니다. 내가 긁고있는 웹 페이지의 모든 링크는 상대적입니다. (예 : 예 : <a href="/free-man-aman-sethi/books/9788184001341.htm" title="A Free Man">) 그래서 그들을 절대적으로 만들려면 urljoin을 사용하여 상대적 링크로 페이지 URL에 가입 할 것이라고 생각했습니다. TypeError : Python에서 BeautifulSoup로 split을 사용할 때 'NoneType'객체를 호출 할 수 없습니다.

내가 먼저 <a> 태그에서 HREF 값을 추출했다 이렇게하려면하고 그것을 위해 내가 split를 사용하는 것이라고 생각 :

#!/bin/python 
#crawl.py 
import requests 
from bs4 import BeautifulSoup 
from urlparse import urljoin 

html_source=requests.get("http://www.flipkart.com/books") 
soup=BeautifulSoup(html_source.content) 
links=soup.find_all("a") 
temp=links[0].split('"') 

를이 다음과 같은 오류 제공 :

Traceback (most recent call last): 
    File "test.py", line 10, in <module> 
    temp=links[0].split('"') 
TypeError: 'NoneType' object is not callable 

갖는 문서를 제대로 읽으려고하기 전에 잠잠 해져서 이것이 내 목표를 달성하는 최선의 방법은 아니지만 왜 TypeError가 있는지 알고 있습니다.

답변

4

links[0]bs4.element.Tag입니다. split을 찾으려고하면 마법이 생기고 split이라는 하위 요소를 찾으려고 시도하지만 아무 것도 없습니다. 당신은 전화하지 않습니다. HTML을 보는

In [10]: l = links[0] 

In [11]: type(l) 
Out[11]: bs4.element.Tag 

In [17]: print l.split 
None 

In [18]: None() # :) 

TypeError: 'NoneType' object is not callable 

사용 색인 속성 :

In [21]: links[0]['href'] 
Out[21]: '/?ref=1591d2c3-5613-4592-a245-ca34cbd29008&_pop=brdcrumb' 

또는 get을 존재하지 않는 속성의 위험이있는 경우 :

In [24]: links[0].get('href') 
Out[24]: '/?ref=1591d2c3-5613-4592-a245-ca34cbd29008&_pop=brdcrumb' 


In [26]: print links[0].get('wharrgarbl') 
None 

In [27]: print links[0]['wharrgarbl'] 

KeyError: 'wharrgarbl' 
1

Tag 클래스 속성에 액세스하는 프록시를 (사용하기 때문에 Pavel이 지적했듯이 가능한 경우 하위 요소에 액세스하는 데 사용됨) 찾을 수없는 경우 None 기본값이 반환됩니다.

복잡한 예 :

>>> print soup.find_all('a')[0].bob 
None 
>>> print soup.find_all('a')[0].foobar 
None 
>>> print soup.find_all('a')[0].split 
None 

당신은 사용할 필요가 :

>>> print soup.find_all('a')[0].get 
<bound method Tag.get of <a href="test"></a>> 
+0

하위 요소, 속성이 아 U니다. –

0

난 그냥 같은 오류가 발생했습니다 - 그래서 4 년 뒤 가치가 무엇을 :

soup.find_all('a')[0].get('href') 

: 수프 요소를 나눌 필요가 있다면 분할하기 전에 str()을 사용할 수도 있습니다. 귀하의 경우에는 다음과 같습니다 :

temp = str(links).split('"')