我遇到一个问题,即并非所有实例都在相对简单的beautifulsoup抓取中捕获。我正在运行的是以下内容:
from bs4 import BeautifulSoup as bsoup
import requests as reqs
home_test = "https://fbref.com/en/matches/033092ef/Northampton-Town-Lincoln-City-August-4-2018-League-Two"
away_test = "https://fbref.com/en/matches/ea736ad1/Carlisle-United-Northampton-Town-August-11-2018-League-Two"
page_to_parse = home_test
page = reqs.get(page_to_parse)
status_code = page.status_code
status_code = str(status_code)
parse_page = bsoup(page.content, 'html.parser')
find_stats = parse_page.find_all('div',id="team_stats_extra")
print(find_stats)
for stat in find_stats:
add_stats = stat.find_next('div').get_text()
print(add_stats)
如果您看第一张照片,则抓图将捕获我所关注的网站部分,但是,如果您查看第二张纸,则实际上并没有使用前一个实例的一半完全没有我对此没有任何限制,因此从理论上讲,它应该接受所有正确的限制。
我已经测试过find_next,find或find_all的许多不同的变体,但是第二个循环的find永远不会占用所有的变体。
结果总是:
Northampton Lincoln City
12Fouls13
6Corners1
7Crosses2
89Touches80
应改为以下内容:
Northampton Lincoln City
12Fouls13
6Corners1
7Crosses2
89Touches80
Northampton Lincoln City
2Offsides2
9Goal Kicks15
32Throw Ins24
18Long Balls23
答案 0 :(得分:1)
find_stats = parse_page.find_all('div',id="team_stats_extra")
实际上仅返回一个块,因此下一个循环仅执行一次迭代。
您可以通过以下方式更改选择div块的方式:
find_stats = parse_page.select('div#team_stats_extra > div')
print(len(find_stats)) # >>> returns 2
for stat in find_stats:
add_stats = stat.get_text()
print(add_stats)
要说明选择器select('div#team_stats_extra > div')
,它与:
div
的{{1}}块team_stats_extra
的直属孩子答案 1 :(得分:1)
parse_page.find_all
返回一个项目的列表,即带有id="team_stats_extra"
的WebElement。循环必须在其子元素上
find_stats = parse_page.find_all('div', id="team_stats_extra")
all_stats = find_stats[0].find_all('div', recursive=False)
for stat in all_stats:
print(stat.get_text())
如果您有多个表,请使用两个循环
find_stats = parse_page.find_all('div', id="team_stats_extra")
for stats in find_stats:
all_stats = stats.find_all('div', recursive=False)
for stat in all_stats:
print(stat.get_text())
答案 2 :(得分:1)
对于bs4 4.7.1+,您可以使用:has来确保以th
类获得适当的div,因此您有适当的元素可以循环使用
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://fbref.com/en/matches/033092ef/Northampton-Town-Lincoln-City-August-4-2018-League-Two')
soup = bs(r.content, 'lxml')
for div in soup.select('#team_stats_extra div:has(.th)'):
print(div.get_text())