网页抓取和查找元素
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 是一种非常强大的方法,可以为目标元素指定一组父子关系。以上是关于网页抓取和查找元素的主要内容,如果未能解决你的问题,请参考以下文章