【问题标题】:How to access the subtags within a tag using beautifulsoup in python?如何在python中使用beautifulsoup访问标签内的子标签?
【发布时间】:2023-09-05 03:58:01
【问题描述】:

我正在尝试从 MLB.com 检索 2016 赛季的球员统计数据。我在 Python 中使用 Beautiful Soup,我需要提取此处看到的表格中的信息:

http://mlb.mlb.com/stats/sortable.jsp#elem=%5Bobject+Object%5D&tab_level=child&click_text=Sortable+Player+hitting&game_type='R'&season=2016&season_type=ANY&league_code='MLB'&sectionType=sp&statType=hitting&page=1&ts=1493672037085&playerType=ALL&sportCode='mlb'&split=&team_id=&active_sw=&position=&page_type=SortablePlayer&sortOrder='desc'&sortColumn=ab&results=&perPage=442&timeframe=&last_x_days=&extended=0

这是我尝试过的:

r=requests.get(url)
soup=BeautifulSoup(r.content,'html.parser')
gdata=soup.find_all('div',{'id':'datagrid'})
print(gdata)

这应该返回标签内的所有子标签,但事实并非如此。结果如下:

[<div id="datagrid"></div>]

谁能解释为什么这不会产生表格的内容?此外,我该怎么做才能访问表格的内容?

谢谢

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    如果您查看网页的源代码,看起来datagrid div 实际上是空的,并且统计信息作为来自this URL 的 json 动态插入。也许您可以改用它。为了弄清楚这一点,我查看了页面源代码,发现该 div 没有子元素,然后使用 Chrome 开发人员工具的“网络”选项卡查找它提取数据的请求:

    1. 打开网页
    2. 打开 chrome 开发人员工具,Command+Option+I (Mac) 或 Control+Shift+I(Windows、Linux)。
    3. 在打开工具的情况下刷新网页,以便它处理网络请求,然后等待页面加载
    4. (可选)在网络上的搜索栏中输入 xml 以将搜索结果缩小到可能包含数据的请求
    5. 单击每个请求并查看响应的预览。在这一点上,我只是手动检查了响应,看看哪些有你的数据。我很幸运,第一次尝试就得到了你的,因为它的名字中有统计数据。

    【讨论】:

    • 感谢您的回复!我可以并且将使用该 URL 存储我的数据。我还需要从同一个地方找到更多数据(不同的统计数据)。您能否更详细地解释一下您是如何确定数据网格从哪个 URL 获取信息的?
    • 所以我想我找到了正确的请求(对于我正在处理的这个例子,它的标题是“bam.xml.js”),因为它是在表加载时请求的,并且是一个 xml 文件。但是,我仍然没有在请求响应中看到任何 URL。您能否截取 URL 在请求中的位置的屏幕截图?
    • 在“标题”选项卡下的“常规”(第一部分)中,您应该看到“请求 URL”作为第一项。您还可以双击列表中的请求,这将在一个新选项卡中打开它,您可以在其中复制 URL
    • 我得到了链接 (mlb.mlb.com/shared/scripts/bam/bam.xml.js),但它引导我进入响应页面,而不是第一个示例中的统计信息。我有错误的要求吗?
    • 没关系,我确实有错误的要求。正确的请求最终是“stats.splayer?season=2016&...”非常感谢!
    最近更新 更多