python - 如何使用 beautiful soup 来抓取网站来迭代并获取所有值?

标签 python python-3.x web-scraping beautifulsoup

这是我的 HTML 页面的一部分,我使用 Beautiful Soup 将其解析为变量。我需要提取一些文本值并稍后将它们插入到表中。 我需要球员的姓名、球队和积分。

我可以使用 next_sibling 获取第一个玩家名称和第二个玩家名称,但无法遍历整个页面。

<h3>NBA Player Points</h3>
<br>

0089, Thu Jan 16 03:00:00 CET 2020, DEN/CHA-Murray J. (DEN)
<ul>
<li>Player Points  [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Points [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Points [Under : 1.85, Over : 1.85, OU : 18.5]</li>
<li>Player Points [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Index Rating [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Assists [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Rebounds [Under : 1.0, Over : 1.0, OU : 0.0]</li>
</ul>

0761, Thu Jan 16 03:00:00 CET 2020, DEN/CHA-Rozier T. (CHA)
<ul>
<li>Player Points  [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Points [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Points [Under : 1.75, Over : 1.95, OU : 18.5]</li>
<li>Player Points [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Index Rating [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Assists [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Rebounds [Under : 1.0, Over : 1.0, OU : 0.0]</li>
</ul>

1491, Thu Jan 16 03:00:00 CET 2020, DEN/CHA-Grant J. (DEN)
<ul>
<li>Player Points  [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Points [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Points [Under : 1.85, Over : 1.85, OU : 13.5]</li>
<li>Player Points [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Index Rating [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Assists [Under : 1.0, Over : 1.0, OU : 0.0]</li>
<li>Player Rebounds [Under : 1.0, Over : 1.0, OU : 0.0]</li>
</ul>

这是我想从此 HTML 中获得的内容:

球员:穆雷·J.

团队:DEN

玩家积分:18.5

球员:罗齐尔·T。

团队:CHA

玩家积分:18.5

玩家:格兰特·J.

团队:DEN

玩家积分:13.5

有什么想法吗?

最佳答案

不是最优雅的代码,但它应该可以帮助您实现目标。这里使用的主要字符串操作工具是 partition() 方法,它将字符串围绕分隔符分成 3 个子字符串。然后使用 strip()replace() 方法从这些字符中删除不必要的字符。

from bs4 import BeautifulSoup as bs
players = """[your html above]"""

soup = bs(players,'lxml')
names = soup.select('ul')
for name in names:
    dat = name.previous.strip().partition('-')[2]
    print('Name:',dat.partition('. ')[0]+'.')
    print('Team:',dat.partition('. ')[2].replace('(','').replace(')',''))
    print('Player Points:',name.select('li')[2].text.partition(', OU : ')[2].replace(']',''))

输出:

Name: Murray J.
Team: DEN
Player Points: 18.5
Name: Rozier T.
Team: CHA
Player Points: 18.5
Name: Grant J.
Team: DEN
Player Points: 13.5

关于python - 如何使用 beautiful soup 来抓取网站来迭代并获取所有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59762032/

相关文章:

python - Pylons 1.0 AttributeError : 'module' object has no attribute 'metadata'

python - 如何将自定义解析器与 Python 的 Beautiful Soup 一起使用?

python - 登录ubuntu之前如何在python守护进程中使用DBUS

python - 检查数据框列中的所有值是否相同

rvest:语言选择在 tripadvisor 中不起作用

python - 用 BeautifulSoup 和多个段落进行抓取

python - OpenCV的Python面部检测错误

python - 如何使我的 pylab.poly1d(fit) 通过零?

python - 为什么我在抓取网站时会得到一个空列表?

Python 3 - 将变量导入字典