2016-08-07 2 views
1

나는 wired.com에서 기사를 얻으려고합니다. 이 같은 일반적으로 자신의 기사 '내용보기 :BeautifulSoup : findAll 재귀가 작동하지 않습니다.

<article itemprop="articleBody"> 
    <p>Some text</p> 
    <p>Next text</p> 
    <p>...</p> 
    <p>...</p> 
</article> 

또는과 같습니다 :

<article itemprop="articleBody"> 
    <div class="listicle-captions marg-t..."> 
     <p></p> 

    </div> 

</article> 

은 그래서 페이지 1 형의 경우, <p><h>는, 추출 할 페이지의 경우 동안 유형 2입니다. 다른 것을하십시오. 따라서 <p><h><article>의 직계 하위 항목 인 경우 유형 1입니다. 다음 코드를 시도한 결과 <p><h>을 찾고 태그 이름을 출력합니다. 문제는, recursive="False"은 유형 2 페이지에서 테스트했을 때 태그를 찾지 못했지만 (나는 NonType 객체를 얻는 것으로 예상했기 때문에) 도움이되지 않는 것 같습니다.

import urllib.request 
from bs4 import BeautifulSoup 
import datetime 
import html 
import sys 

articleUrl="https://www.wired.com/2016/07/greatest-feats-inventions-100-years-boeing/" 

soupArticle=BeautifulSoup(urllib.request.urlopen(articleUrl), "html.parser") 

articleBody=soupArticle.find("article", {"itemprop":"articleBody"}) 
articleContentTags=articleBody.findAll(["h1", "h2","h3", "p"], recursive="False") 

for tag in articleContentTags: 
    print(tag.name) 
    print(tag.parent.encode("utf-8")) 

왜 작동하지 않습니까?

PS 또한 일반적으로 findAllfindChildren을 사용하는 것과이 경우에 차이가 있습니까? 이 두 .. 나에게 같은 모양

답변

2

문자 "False" 사용으로 동일하지입니다 문자열 부울False, 당신은 실제로 recursive=False 전달해야 모든 비어 있지 않은 문자열이 예정

articleBody.find_all(["h1", "h2","h3", "p"], recursive=False) 

truey 값으로 간주되면 전달할 수있는 유일한 문자열은 빈 문자열, 즉 recursive=""입니다. 당신이을 찾을 수 없습니다 find_all를 호출로

In [17]: bool("False") Out[17]: True In [18]: bool("foo") Out[18]: True In [19]: bool("") Out[19]: False 

그러나 실제 부울False를 사용하는 스틱, 또한 당신은
recursive=False, None이 반환 빈 목록 /의 ResultSet을 얻을 것이다.

+0

감사합니다. 그것은 완전히 나의 통지를 피했다. – parsecer

+0

아무런 문제가 없습니다. 천만에요. –

관련 문제