【问题标题】:Python BeautifulSoup get text from classPython BeautifulSoup 从类中获取文本
【发布时间】:2020-05-03 04:30:44
【问题描述】:

如何从该 HTML 代码中获取文本“Lionel Messi”?

<a href="/20/player/44079/lionel-messi" class="player_name_players_table">Lionel Messi</a>

这是我目前的代码:

import requests
import urllib.request
import time
from bs4 import BeautifulSoup

page = requests.get('https://www.futbin.com/players')
soup = BeautifulSoup(page.content, 'lxml')

pool = soup.find(id='repTb')


player_names = pool.find_all(class_='player_name_players_table')


print(player_names[0])

当我打印 player_names 时,我得到这个结果:

/Users/ejps/PycharmProjects/scraper_players/venv/bin/python /Users/ejps/PycharmProjects/scraper_players/scraper.py
<a class="player_name_players_table" href="/20/player/44079/lionel-messi">Lionel Messi</a>

Process finished with exit code 0

但是我必须输入什么代码才能只获取它的文本?

我想在我的代码中从该页面中抓取所有玩家姓名。但首先我需要找到一种方法来提取我认为的文本。

不幸的是,无法找到使其工作的方法。

我是python新手,尝试做一些项目来学习它。

编辑:

在 cmets 的帮助下,我得到了我需要的文本。

我这里只有一个问题。

是否可以仅通过部分文本找到class_?

像这样:

prating = pool.find_all(class_='form rating ut20')

完整的课程是

class="form rating ut20 toty gold rare"

但它正在改变。始终相同的部分是“form rating ut20”,所以我想也许有某种占位符可以让我搜索所有“class”名称,包括“form rating ut20”

你能帮我解决这个问题吗?

【问题讨论】:

标签: beautifulsoup get python-requests


【解决方案1】:

要选择特定的类,您可以使用正则表达式,或者如果您安装了bs4 4.7.1或更高版本,您可以使用css选择器。

使用regular expression 将获得元素列表。

import re
prating = pool.find_all(class_=re.compile("form rating ut20"))

或者使用 css 选择器将获得元素列表。第一个 css 选择器表示包含,其他一个表示开头。

prating = pool.select('[class*="form rating ut20"]')

prating = pool.select('[class^="form rating ut20"]')

【讨论】:

    【解决方案2】:

    使用 getText() 方法获取文本。

     player_names[0].getText()
    

    【讨论】:

    • 给我这个错误:AttributeError:ResultSet 对象没有属性'getText'。您可能将元素列表视为单个元素。当您打算调用 find() 时,您是否调用了 find_all()?进程以退出代码 1 结束
    • 您正在尝试调用列表中的 getText()。确保对列表中的单个项目调用 getText()。
    • import requests import urllib.request import time from bs4 import BeautifulSoup page = requests.get('futbin.com/players') soup = BeautifulSoup(page.content, 'lxml') pool = soup.find(id ='repTb') player_names = pool.find_all(class_='player_name_players_table') print(player_names[0].getText())
    • 如果要获取所有玩家名字的列表:[player_names[i].getText() for i in range(0,len(player_names))]
    • 另外,如果您觉得这个答案有用,请点赞。谢谢
    猜你喜欢
    • 2018-01-09
    • 2016-03-24
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多