Python HTML Web抓取标题和标题

时间:2020-10-03 17:52:19

标签: python beautifulsoup

代码如下:

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>]

1 个答案:

答案 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&nbsp;星期日
            <a href="javascript:void(0)" onclick="miniopen('http://zq.win007.com/ClientErr/OddsErr.aspx?ScheduleID=1723863&amp;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(' ')

返回“法甲”。