아름다운 수프와 ID로 div와 그 내용 추출


147
soup.find("tagName", { "id" : "articlebody" })

왜 이것이 <div id="articlebody"> ... </div>사이에 태그와 물건을 반환하지 않습니까? 아무것도 반환하지 않습니다. 그리고 나는 그것이 바로 그것을 쳐다보고 있기 때문에 그것이 존재한다는 것을 알고 있습니다.

soup.prettify()

soup.find("div", { "id" : "articlebody" }) 또한 작동하지 않습니다.

( 편집 : BeautifulSoup이 내 페이지를 올바르게 구문 분석하지 않는 것으로 나타났습니다 . 구문 분석하려는 페이지가 SGML 등으로 올바르게 포맷되지 않았 음을 의미합니다)


답변:


202

코드가 제대로 작동하므로 예제 문서를 게시해야합니다.

>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

<div>내부에서 <div>s를 찾는 것도 효과가 있습니다.

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

2
나의 예제 문서는 엄청나 다. 문제를 추적하고 있습니다 .div의 div에서는 작동하지 않는다고 생각합니다. 나는 10을 초래 한 print len ​​(soup ( 'div'))으로 문서에 몇 개의 div가 있는지 세었고 파이어 버그로 10 개 이상의 div를 명확하게 볼 수 있습니다. 그래서 나는 그것이 div 내부에서 div를 찾을 수 없다고 생각하므로 래퍼별로 래퍼를 좁힐 필요가 있습니다.
Tony Stark

8
그렇다면 귀하의 질문에 대답하는 것은 불가능합니다. 수정 구슬은 신뢰할만한 디버깅 방법이 아닙니다. :)
Lukáš Lalinský

1
이 코드를 시도했습니다. div에 <embed>가 있고 그 안에 포함을 인쇄 할 수 없습니다.
Vincent

13
또는 더 간단히div = soup.find(id="articlebody")
jfs

4
또는soup.find('div', id='articlebody')
Trevor Boyd Smith

71

그것으로 요소를 찾으려면 id:

div = soup.find(id="articlebody")

15

Beautiful Soup 4는 이 메소드 를 사용하여 대부분의 CSS 선택기 를 지원 하므로 다음 과 같은 선택기를 사용할 수 있습니다 ..select()id

soup.select('#articlebody')

요소 유형을 지정해야하는 경우 선택기 앞에 유형 선택기 를 추가 할 수 있습니다 id.

soup.select('div#articlebody')

.select()메소드는 요소 콜렉션을 리턴하므로 다음 .find_all()메소드 예제 와 동일한 결과를 리턴합니다 .

soup.find_all('div', id="articlebody")
# or
soup.find_all(id="articlebody")

단일 요소 만 선택하려면 다음 .find()방법을 사용하십시오 .

soup.find('div', id="articlebody")
# or
soup.find(id="articlebody")

13

'div'태그가 너무 많이 중첩 된 경우 문제가 있다고 생각합니다. 페이스 북 html 파일에서 일부 연락처를 구문 분석하려고하는데 Beautifulsoup이 "fcontent"클래스의 "div"태그를 찾을 수 없습니다.

이것은 다른 클래스에서도 발생합니다. 일반적으로 div를 검색하면 중첩되지 않은 div 만 바뀝니다.

html 소스 코드는 친구 (친구가 아닌)의 친구 목록에있는 페이스 북의 모든 페이지가 될 수 있습니다. 누군가 그것을 테스트하고 조언을 줄 수 있다면 정말 감사하겠습니다.

이 코드는 "fcontent"클래스를 사용하여 "div"태그 수를 인쇄하려고합니다.

from BeautifulSoup import BeautifulSoup 
f = open('/Users/myUserName/Desktop/contacts.html')
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'class':'fcontent'})
print len(list)

9

아마도 기본 beautifulsoup 파서에 문제가있을 수 있습니다. 'lxml'과 같은 다른 구문 분석기를 변경 한 후 다시 시도하십시오.


이것은 나를 위해 일했습니다. 감사합니다! 나는 사용했다soup = BeautifulSoup(data, parser="html.parser")
will-hart

8

beautifulsoup 소스에서이 행은 div가 div 내에 중첩되도록합니다. lukas의 의견에 대한 귀하의 우려는 유효하지 않습니다.

NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']

내가해야 할 일은 원하는 속성을 지정하는 것입니다.

source.find('div', attrs={'id':'articlebody'})

5

당신은 시도 soup.findAll("div", {"id": "articlebody"})했습니까?

미친 듯이 들리지만 야생에서 물건을 긁어 모으는 경우 여러 div를 배제 할 수 없습니다 ...


4

나는 사용했다 :

soup.findAll('tag', attrs={'attrname':"attrvalue"})

find / findall에 대한 내 구문으로; 즉, 태그와 속성 목록 사이에 다른 선택적 매개 변수가 없으면 다르지 않아야합니다.


4

Google을 긁어 내려고하면서 나에게도 일어났다.
pyquery를 사용했습니다.
설치:

pip install pyquery

사용하다:

from pyquery import PyQuery    
pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
tag = pq('div#articlebody')

3

다음은 코드 조각입니다

soup = BeautifulSoup(:"index.html")
titleList = soup.findAll('title')
divList = soup.findAll('div', attrs={ "class" : "article story"})

보시다시피 모든 태그를 찾은 다음 class = "article"이있는 모든 태그를 찾습니다.


0

Id속성은 항상 고유하게 식별됩니다. 즉, 요소를 지정하지 않아도 직접 사용할 수 있습니다. 따라서 요소가 내용을 구문 분석 해야하는 경우 장점입니다.

divEle = soup.find(id = "articlebody")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.