python - 如何从 HTML 表格中获取文本?

标签 python html web-scraping

我正在尝试从 https://fortnitetracker.com/events/epicgames_S10_FNCS_Week5_NAE 中抓取数据.具体来说,我正在尝试获取特定玩家获得的排名和积分数。我去了该网站,找到了特定播放器(“Nickmercs”)位于 HTML 中的实例,如下所示: HTML Text 你可以看到“排名”在他的名字上方显示为 56,分数在他的名字下方几行显示,他的名字也是 56。然后我编写了以下 Python 3 程序来从网站上抓取数据:

import requests

class tracker:

url = "https://fortnitetracker.com/events/epicgames_S10_FNCS_Week5_NAE"

    def getReq(website):
        req = requests.get(website)
        if req:
            return req 

    req = getReq(url)
    text = req.text
    index = text.find("nickmercs")
    split = text[index:index+1000]
    print (split)

运行该程序会生成大部分 HTML 代码,但它找到的“Nickmercs”实例并不是我要找的那个。上面显示的 HTML 代码图片中显示的是实际的第一个实例,如果页面上的“Nickmercs”字符串,但由于某种原因它不在 req.text/我的请求的响应中。结果我回去修改我的代码,打印出第一个实例实际所在的位置,发现该行与 HTML 代码图片中显示的不同。应该列出名称“Nate Hill、Nickmercs、SypherPK”的那一行实际上看起来像这样:

<span :style="{ 'color': '#' + metadata.primary_color }">{{ getPlayerNameList(entry.teamAccountIds, 4) }}</span>

我对 HTML 的工作原理知之甚少,所以我想知道是否可以解决这个问题。它似乎在调用一些(我想象的是)名为 getPlayerNameList() 的方法,该方法将名称放在正确的位置,但这样做是为了让我无法轻松搜索名称/抓取数据。有办法解决这个问题吗?非常感谢任何帮助!

最佳答案

网站是动态的,因此,您需要某种方式来访问页面最初加载后填充的数据。一种这样的方法是使用 selenium:

from selenium import webdriver
from bs4 import BeautifulSoup as soup
d = webdriver.Chrome('/path/to/chromedriver')
d.get('https://fortnitetracker.com/events/epicgames_S10_FNCS_Week5_NAE')
h, *r = [[i.text for i in b.find_all('th' if b.td is None else 'td')] for b in soup(d.page_source, 'html.parser').find('div', {'id':'leaderboard'}).table.find_all('tr')]
new_data = {tuple(b.split(', ')):dict(zip([h[0], *h[2:]], [a[1:-1], *c])) for a, b, *c in r}

现在,按名字查找玩家:

data = [b for a, b in new_data.items() if 'Nickmercs' in a][0]

输出:

{'Rank': '56', 'Points': '56 Top 0.373%', 'Matches': '10', 'Wins': '0', 'K/D': '3.50', 'Avg Place': '16.10'}

对于你的具体目标值(Rank):

rank = [b for a, b in new_data.items() if 'Nickmercs' in a][0]['Rank']

输出:

56

关于python - 如何从 HTML 表格中获取文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58127370/

相关文章:

javascript - 将多个codemirror脚本应用于一个iframe

python - 当表列中有文本时,为什么我得到 None ?

python - 在 SQLAlchemy 的 HAVING() 子句中使用标签

python - pandas:如何查询多级列数据框?

python - 发送电子邮件时 MIMEText UTF-8 编码问题

python - 需要帮助从 python 脚本创建 exe

javascript - 如何在 Handlebars 中获取名称-值对的名称?

javascript - jQuery 检查加载时是否选择了单选选项

python - 学习使用 Selenium 和 Python 进行抓取

java - 通过 Android/jsoup 以 URL 格式抓取数据