2017-07-02 81 views
6

我目前正在尝试与Python 3.6中的请求和BeautifulSoup模块练习,并遇到了一个问题,我似乎无法在其他问题和答案中找到任何信息。美丽的汤找不到标签

看起来,在页面中的某个时刻,Beuatiful Soup停止识别标签和ID。我想从一个页面拉播放的播放数据是这样的:

http://www.pro-football-reference.com/boxscores/201609080den.htm

import requests, bs4 

source_url = 'http://www.pro-football-reference.com/boxscores/201609080den.htm' 
res = requests.get(source_url) 
if '404' in res.url: 
    raise Exception('No data found for this link: '+source_url) 

soup = bs4.BeautifulSoup(res.text,'html.parser') 

#this works 
all_pbp = soup.findAll('div', {'id' : 'all_pbp'}) 
print(len(all_pbp)) 

#this doesn't 
table = soup.findAll('table', {'id' : 'pbp'}) 
print(len(table)) 

使用Chrome的检查,我可以看到,该表确实存在。我也试图在HTML的后半部分使用'div's'和'tr',它似乎不起作用。我试过标准的'html.parser'以及lxml和html5lib,但似乎没有任何工作。

我在这里做错了什么,或者在HTML或其格式中有什么东西妨碍BeautifulSoup正确地找到后面的标签?我遇到了这家公司运营的类似网页(hockey-reference.com,basketball-reference.com)的问题,但已能够在其他网站上正确使用这些工具。

如果它是HTML的东西,有没有更好的工具/库来帮助提取这些信息呢?

感谢你的帮助, BF

+0

你想从该表中解析什么? 全部表?只有几列?几个细胞? –

+0

你的陈述'table = soup.findAll('table',{'id':'pbp'})'不是_不working_,它只是_doesn't找不到''div元素与'id = pbp' –

+0

@DmitriyFialkovskiy我试图最终创建一个特定游戏的游戏的Excel文件。一旦我可以将汤放在桌子上,我相信我可以通过tr和td标签循环来获取文本,并使用openpyxl将其转化为excel。我想最终我的问题是为什么不bs4在html中找到标签。看来bs4可以在HTML中的评论之前找到任何标签,但之后不会 - 评论是否会影响解析?是否有任何方法可以准确地从评论之后拉取标签? –

回答

1

BS4将不能够做一个URL的GET请求后执行网页的JavaScript。我认为关注表是从客户端JavaScript加载的异步。

因此,在抓取HTML之前,客户端JavaScript将需要先运行。这post描述如何做!

+0

再次感谢,这是问题所在。玩Dryscrape帮助。猜猜我有另一个图书馆添加到我的学习清单。 –

0

好吧,我得到了什么问题。你试图解析评论,而不是一个普通的html元素。 对于这样的情况下,你应该使用CommentBeautifulSoup,像这样:

import requests 
from bs4 import BeautifulSoup,Comment 

source_url = 'http://www.pro-football-reference.com/boxscores/201609080den.htm' 
res = requests.get(source_url) 
if '404' in res.url: 
    raise Exception('No data found for this link: '+source_url) 

soup = BeautifulSoup(res.content,'html.parser') 

comments=soup.find_all(string=lambda text:isinstance(text,Comment)) 

for comment in comments: 
    comment=BeautifulSoup(str(comment), 'html.parser') 
    search_play = comment.find('table', {'id':'pbp'}) 
    if search_play: 
     play_to_play=search_play 
+0

@Big Fore,有没有反馈?不知何故,我的回答有帮助吗? –

+0

你的回答对我的学习过程肯定有帮助,但并不是解决我遇到的特殊问题。我的问题是在评论后找到任何标签。事实证明,我在浏览器中查看HTML后,通过JavaScript加载评论,所以没有显示在请求文本中,但需要进一步的库来解析。感谢您的帮助德米特里 –

+0

完全不理解您 - 您的目的是在特定评论之后通过其文本或标签来收集评论本身? –