복붙노트

[PYTHON] 아름다운 스프 4 find_all은 아름다운 스프 3이 발견 한 링크를 찾지 못합니다.

PYTHON

아름다운 스프 4 find_all은 아름다운 스프 3이 발견 한 링크를 찾지 못합니다.

정말 귀찮은 버그를 발견했습니다. BeautifulSoup4 (패키지 : bs4)는 이전 버전 (패키지 : BeautifulSoup)보다 태그를 적게 찾습니다.

다음은 그 문제의 재생산 가능한 사례입니다.

import requests
import bs4
import BeautifulSoup

r = requests.get('http://wordpress.org/download/release-archive/')
s4 = bs4.BeautifulSoup(r.text)
s3 = BeautifulSoup.BeautifulSoup(r.text)

print 'With BeautifulSoup 4 : {}'.format(len(s4.findAll('a')))
print 'With BeautifulSoup 3 : {}'.format(len(s3.findAll('a')))

산출:

With BeautifulSoup 4 : 557
With BeautifulSoup 3 : 1701

당신이 볼 수 있듯이 그 차이는 사소한 것이 아닙니다.

누군가가 궁금해하는 경우 모듈의 정확한 버전은 다음과 같습니다.

In [20]: bs4.__version__
Out[20]: '4.2.1'

In [21]: BeautifulSoup.__version__
Out[21]: '3.2.1'

해결법

  1. ==============================

    1.BeautifulSoup 4가 표준 라이브러리 html.parser 옵션을 통해 해당 구문 분석기를 사용한다는 의미의 lxml이 설치되었습니다.

    BeautifulSoup 4가 표준 라이브러리 html.parser 옵션을 통해 해당 구문 분석기를 사용한다는 의미의 lxml이 설치되었습니다.

    lxml을 3.2.1로 업그레이드 할 수 있습니다 (테스트 페이지에 대해 1701 개의 결과를 반환합니다). lxml 자체는 libxml2와 libxslt를 사용합니다. 대신 /를 업그레이드해야 할 수도 있습니다. lxml 요구 사항 페이지를 참조하십시오. 현재 libxml2 2.7.8 이상이 권장됩니다.

    또는 수프를 파싱 할 때 명시 적으로 다른 파서를 지정하십시오.

    s4 = bs4.BeautifulSoup(r.text, 'html.parser')
    
  2. from https://stackoverflow.com/questions/17698836/beautiful-soup-4-find-all-dont-find-links-that-beautiful-soup-3-finds by cc-by-sa and MIT license