网页抓取和查找元素

Posted

技术标签:

【中文标题】网页抓取和查找元素【英文标题】:Webscraping and finding elements 【发布时间】:2021-09-25 13:20:42 【问题描述】:

我试图找出比赛何时被推迟并获取相关的球队信息或比赛号码,因为我将球队缩写附加到列表中。目前发生的情况是,它只获取延期的项目,而跳过没有延期的比赛。我想我需要更改 soup.select 行,或者做一些稍微不同的事情,但无法弄清楚。

代码没有抛出任何错误,但返回的列表是 [0,1,2,3]。但是,如果您打开 https://www.rotowire.com/baseball/daily-lineups.php,它应该返回 [0,1,14,15],因为这些是延迟比赛的团队元素。

from bs4 import BeautifulSoup
import requests

url = 'https://www.rotowire.com/baseball/daily-lineups.php'

r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

x = 0

gamesRemoved = []

for tag in soup.select(".lineup__main > div"):
    ppcheck = tag.text
    if "POSTPONED" in ppcheck:
        print(x)
        print('Postponement')
        first_team = x*2
        print(first_team)
        gamesRemoved.append(first_team)
        second_team = x*2+1
        gamesRemoved.append(second_team)
        x+=1
        
    else:
        x+=1
        continue
print(gamesRemoved)   

【问题讨论】:

我不明白 - 当我点击您的链接时,我只看到两个带有“POSTPONED”的红色框。您想获取什么信息? 感谢您查看我的问题。这是一个更大项目的一部分,但我试图最小化以使人们更容易复制。我基本上刮掉了每支球队和他们的阵容。例如,它抓取 ['MIN', 'DET', 'MIA', 'PHI', 'BOS', 'NYY', 'SD', 'WAS']....我需要它返回元素 0 和1 因为第一场 MIN vs DET 比赛被推迟。然后,我需要它返回 14 和 15,因为第二场 MIN vs DET 比赛也被推迟了。然后,这将允许我从我拥有的另一个列表中删除 MIN 和 DET。我希望这是有道理的 - 我正在尽我所能简化它。 那么在这种情况下我认为Ajax的答案已经可以了:) 【参考方案1】:

您可以使用BeautifulSoup.select 并检查'is-postponed' 是否作为类名存在于阵容框中:

from bs4 import BeautifulSoup as soup
import requests
d = soup(requests.get('https://www.rotowire.com/baseball/daily-lineups.php').text, 'html.parser')
p = [j for i, a in enumerate(d.select('.lineup.is-mlb')) for j in [i*2, i*2+1] if 'is-postponed' in a['class']]

输出:

[0, 1, 14, 15]

【讨论】:

这行得通,谢谢!你对学习如何抓取元素,特别是子元素有什么建议吗?我可以刮桌子,但是当我需要真正深入研究元素时,我似乎碰壁了。任何可以提供帮助的教程/链接都会很棒。 @ShawnSchreier This SO 链接应该可以帮助您了解更多信息。不过,总的来说,css selectors 是一种非常强大的方法,可以为目标元素指定一组父子关系。

以上是关于网页抓取和查找元素的主要内容,如果未能解决你的问题,请参考以下文章

抓取特定文本(字符串)的网页

确定网页中的 HTML 元素以进行网页抓取

请教网页里的特定数据怎么抓取?

如何用python抓取这个网页的内容?

使用 selenium 和 bs4 进行网页抓取

抓取网页时html元素找不到