美丽的汤找不到标签

Posted

技术标签:

【中文标题】美丽的汤找不到标签【英文标题】:Beautiful Soup Can't Find Tags 【发布时间】:2017-12-05 15:37:55 【问题描述】:

我目前正在尝试使用 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's 上使用它,但它似乎不起作用。我已经尝试过标准的“html.parser”以及 lxml 和 html5lib,但似乎没有任何效果。

我在这里做错了什么,还是 HTML 或其格式中的某些内容阻止了 BeautifulSoup 正确找到后面的标签?我遇到了这家公司(hockey-reference.com、basketball-reference.com)运行的类似页面的问题,但能够在其他网站上正确使用这些工具。

如果它与 HTML 有关,是否有更好的工具/库来帮助提取这些信息?

感谢您的帮助, 高炉

【问题讨论】:

你想从那个表中解析什么?全桌?只有几列?几个细胞? 您的声明 table = soup.findAll('table', 'id' : 'pbp')不起作用,它只是找不到 div 元素与id = pbp 如果是这样,页面上的 javascript 需要在抓取之前先加载。这篇文章似乎有这样做的方法 - ***.com/questions/8049520/…. @qwertyuiop9 谢谢!这正是我一直在寻找的。我没有意识到汤可能不包含我通过浏览器查看的所有 html。我会玩 Selenium 或 Dryscrape,看看我能弄清楚什么。再次感谢 这能回答你的问题吗? Web-scraping JavaScript page with Python 【参考方案1】:

在对 URL 执行 GET 请求后,BS4 将无法执行网页的 javascript。我认为关注的表是从客户端 javascript 异步加载的。

因此,客户端 javascript 需要在抓取 HTML 之前首先运行。这个post 描述了如何做到这一点!

【讨论】:

再次感谢,这就是问题所在。与 Dryscrape 一起玩会有所帮助。猜猜我还有另一个图书馆要添加到我的学习清单中。【参考方案2】:

好的,我知道了问题所在。您正在尝试解析 comment,而不是普通的 html 元素。 对于这种情况,您应该使用来自BeautifulSoupComment,如下所示:

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

【讨论】:

@Big Fore,有什么反馈吗?我的回答有帮助吗? 您的回答对我的学习过程肯定有帮助,但不是解决我遇到的特定问题的方法。我的问题是在评论后找到任何标签。事实证明,在通过 javascript 加载评论后,我在浏览器中查看的 HTML 并没有显示在请求文本中,但需要进一步的库来解析。谢谢你的帮助德米特里 不完全理解你 - 你的目的是捕捉评论本身及其文本或标签特定评论之后?

以上是关于美丽的汤找不到标签的主要内容,如果未能解决你的问题,请参考以下文章

如何使用美丽的汤从脚本标签中提取 json?

美丽的汤使用正则表达式查找标签?

提取两个不同标签之间的文本 美丽的汤

使用美丽的汤从标签中提取“href”

在美丽的汤中找到下一个 div 标签

从美丽的汤标签中提取href [重复]