代码如下:
import requests
from bs4 import BeautifulSoup
page = requests.get("http://op1.win007.com/oddslist/1723863.htm")
soup = BeautifulSoup(page.content, 'html.parser')
title = soup.title.get_text()
date = soup.find_all('div', {'class': 'vs'})
final_score = soup.find('div', {'class': 'score'})
half_score = soup.find_all('span', {'class': 'row'})
print(date, title, final_score, half_score)
## Expected print out as follow
## 2020-03-08 23:59 星期日, 法甲, 雷恩 VS 蒙彼利埃, 5,0,2,0
我是Python的初学者。我不知道为什么结果不符合我的预期。例如:
date = 2020-03-08 23:59 星期日
title = '\r\n\t2019-2020 法甲 雷恩 VS 蒙彼利埃 百家欧指-球探体育\r\n'
final_score = [<div class="score">5</div>, <div class="score">0</div>]
half_score = [<span class="row red b">完</span>, <span class="row">(2-0)</span>]
答案 0 :(得分:0)
我建议使用CSS选择器代替类名,因为它们可以使您更好地控制HTML页面的搜索。
几个例子:
搜索日期时,可以使用以下代码:
date = ''.join(soup.select('div.analyhead > div.vs > div.row')[0].find_all(text=True, recursive=False)).strip('\n ')
这段代码会发生什么?
我们有以下HTML代码段:
<div class="analyhead">
<div class="vs">
<div class="row">
<a href="http://info.win007.com/cn/League.aspx?SclassID=11" target="_blank" class="LName">法甲 </a> 2020-03-08 23:59 星期日
<a href="javascript:void(0)" onclick="miniopen('http://zq.win007.com/ClientErr/OddsErr.aspx?ScheduleID=1723863&oddsKind=2');return false;" target="_blank" class="errors">报错</a>
<a href="1723863_3.htm" class="oldb">旧版百家</a>
</div>
</div>
</div>
CSS选择器div.analyhead > div.vs > div.row
指定类“ analyhead”的div元素,其直接子div的类“ vs”和其直接子div的类“ row”。
BeautifulSoup方法select()返回找到的值的列表,因此,我们采用其第一个元素。但是last div不仅包含所需的文本,还包含不需要的“ a”元素。为了排除它们,我们使用方法find_all(text=True, recursive=False)
。
此方法还返回文本值列表,可以使用字符串方法''.join()
合并这些文本值,并可以使用strip('\n ')
去除不需要的空格。
以类似的方式,最终得分和半得分也可以得到:
final_score = ','.join(el.text for el in soup.select('#headVs > div.end > div.score'))
half_score = soup.select('#headVs > div.end > div > span.row')[1].text
更困难的是带有文档标题的情况。 document.title
返回“ 2019-2020法甲雷恩VS蒙彼利埃百家欧指-球探体育”,应对其进行解析以检索所需的文本。
或者您可以使用表达式
title = soup.select('div.analyhead > div.vs > div.row > a')[0].text.strip(' ')
返回“法甲”。