J'essaie de créer un robot en utilisant bs4 et c'est la page cible à partir de laquelle je vais analyser les données

http://sports.news.naver.com/wfootball/news/index.nhn?page=1

Et ce sont les données que je veux obtenir

<html>~~
<head>...</head>
<body>
    <some several layer...>
        <div class="news_list" id="_newsList">
            <h3 class="blind"> ~ </h3>
            <ul>
                <li>
                    <div class="text">
                        <a href="~~~~">
                            <span>"**targetData**"</span>
                </li>
                <li>
                    same structure
                </li>
                <li>...</li>
                several <li>...</li>
            </ul>
        </div>
    </layers...>
</body>
</html>

Et c'est mon code

#-*- coding: utf-8 -*-
import urllib
from bs4 import BeautifulSoup

targettrl = 'http://sports.news.naver.com/wfootball/news/index.nhn?page=1'
soup = BeautifulSoup(urllib.urlopen(targettrl).read(), 'html.parser')
print(soup.find_all("div", {"class":"news_list"}))

Et résultat

[]

Que devrais-je faire?

2
Park GunTae 12 avril 2018 à 07:25

3 réponses

Meilleure réponse

Le contenu que vous recherchez est chargé dynamiquement avec JavaScript et, par conséquent, introuvable dans la source de la page à l'intérieur de la balise <div> que vous recherchez. Mais, les données sont disponibles dans la source de la page à l'intérieur d'une balise <script> au format JSON.

Vous pouvez le gratter en utilisant ceci:

import re
import json
import requests

r = requests.get('http://sports.news.naver.com/wfootball/news/index.nhn?page=1')
script = re.findall('newsListModel:(.*})', r.text)[0]
data = json.loads(script)

for item in data['list']:
    print(item['title'])
    url = 'http://sports.news.naver.com/wfootball/news/read.nhn?oid={}&aid={}'.format(item['oid'], item['aid'])
    print(url)

Production:

‘로마 영웅’ 제코, “첼시 거절? 돈이 중요하지 않아”
http://sports.news.naver.com/wfootball/news/read.nhn?oid=139&aid=0002089601
손흥민, 맨시티전 선발 전망...'시즌 19호' 기대(英 매체)
http://sports.news.naver.com/wfootball/news/read.nhn?oid=139&aid=0002089600
드디어 정해진 UCL 4강 진출팀, 4강 대진은 과연?
http://sports.news.naver.com/wfootball/news/read.nhn?oid=047&aid=0002185662
극적 승리 후 ‘유물급 분수대’에 뛰어든 로마 구단주 벌금형
http://sports.news.naver.com/wfootball/news/read.nhn?oid=081&aid=0002907313
'토너먼트의 남자' 호날두, 팀 득점 6할 책임지다
http://sports.news.naver.com/wfootball/news/read.nhn?oid=216&aid=0000094120
맨유 스카우트 파견...타깃은 기성용 동료 수비수 모슨
http://sports.news.naver.com/wfootball/news/read.nhn?oid=139&aid=0002089598
이번에는 '타점', 늘 새로운 호날두의 키워드
http://sports.news.naver.com/wfootball/news/read.nhn?oid=413&aid=0000064740
승무패 14회차, 토트넘 홈에서 맨시티 이길 것
http://sports.news.naver.com/wfootball/news/read.nhn?oid=396&aid=0000477162
3부까지 추락했던 울버햄튼, 6년 만에 EPL 승격 눈앞
http://sports.news.naver.com/wfootball/news/read.nhn?oid=413&aid=0000064739
메시 밀어낸 호날두…역대 챔스리그 한 시즌 최다골 1∼3위 독식(종합)
http://sports.news.naver.com/wfootball/news/read.nhn?oid=001&aid=0010020684
‘에어 호날두’ 있기에···레알 8년 연속 챔스 4강
http://sports.news.naver.com/wfootball/news/read.nhn?oid=011&aid=0003268539
[UEL] '황희찬 복귀' 잘츠부르크, 역전 드라마 가능할까?
http://sports.news.naver.com/wfootball/news/read.nhn?oid=436&aid=0000028419
[UCL 포커스] 호날두 환상골도, 만주키치 저력도, 부폰에 묻혔다
http://sports.news.naver.com/wfootball/news/read.nhn?oid=139&aid=0002089597
[UCL 핫피플] ‘120골+11G 연속골’ 호날두, 역사는 진행형
http://sports.news.naver.com/wfootball/news/read.nhn?oid=139&aid=0002089596
[SPO 이슈] ‘재점화’ 케인vs살라, 득점왕 경쟁 포인트3
http://sports.news.naver.com/wfootball/news/read.nhn?oid=477&aid=0000118254
UCL 8강 키워드: 공은 둥글다…'3점 차'여도 안심할 수 없었으니까
http://sports.news.naver.com/wfootball/news/read.nhn?oid=477&aid=0000118253
"과르디올라, 시즌 종료 전 1년 계약 연장한다" (英 미러)
http://sports.news.naver.com/wfootball/news/read.nhn?oid=529&aid=0000022390
케이토토 승무패 14회차 투표율 중간집계
http://sports.news.naver.com/wfootball/news/read.nhn?oid=382&aid=0000638196
‘월드컵 스카우팅 리포트 2018’ 발간
http://sports.news.naver.com/wfootball/news/read.nhn?oid=005&aid=0001088317
레알 마드리드, 천신만고 끝에 챔피언스리그 4강
http://sports.news.naver.com/wfootball/news/read.nhn?oid=052&aid=0001134496

Ici, item est un dictionnaire au format suivant:

{'aid': '0002185662',
 'datetime': '2018.04.12 14:09',
 'officeName': '오마이뉴스',
 'oid': '047',
 'sectionName': '챔스·유로파',
 'subContent': '최고의 명경기 예약, 추첨은 4월 13일 오후 7시[오마이뉴스 이윤파 기자]이변이 가득했던 17-18 UEFA 챔피언스리그 8강이 모두 끝나고 4강 진출 팀...',
 'thumbnail': 'http://imgnews.naver.net/image/thumb154/047/2018/04/12/2185662.jpg',
 'title': '드디어 정해진 UCL 4강 진출팀, 4강 대진은 과연?',
 'totalCount': 0,
 'type': 'PHOTO',
 'url': None}

Ainsi, vous pouvez accéder à tout ce que vous voulez en utilisant cela. Remplacez simplement ['title'] par ce que vous voulez. Tout à l'intérieur de chacune des balises <li> est disponible dans les dictionnaires.

2
Keyur Potdar 12 avril 2018 à 05:31

Essayer

soup = BeautifulSoup(urllib.urlopen(targettrl).read(), 'lxml')

Au lieu de

soup = BeautifulSoup(urllib.urlopen(targettrl).read(), 'html.parser')

J'ai essayé avec votre code et @KeyurPotdar et j'ai travaillé pour moi.

0
Freddy 12 avril 2018 à 04:52

Cela fonctionnera.

import requests
from bs4 import BeautifulSoup
targettrl = 'http://sports.news.naver.com/wfootball/news/index.nhn?page=1'
soup = BeautifulSoup(requests.get(targettrl).content, 'html.parser')
print(soup.find_all("div", class_="news_list"))
0
Dimanjan 12 avril 2018 à 04:40