我的if语句无法在bs4标记元素中查找文本,为什么有任何原因?

时间:2019-04-20 08:16:04

标签: python if-statement web-scraping beautifulsoup

我正在尝试查找并打印所有包含我感兴趣的月份的h3标签。为此,我尝试对我的bs4对象(head)和其中的if语句进行一个for循环。指定打印满足条件的行;在这种情况下,如果该行中包含一个字符串(月份),则为这种情况。我遇到的问题是,即使我指定的月份存在于bs4对象/行中,也无法在if语句中打印它们。

我尝试将年份加到月份中,这似乎解决了问题,尽管并不理想。另外,我通过制作一些行的简短列表(手动)并使用该列表而不是bs4对象(head)运行一个for循环来测试方法背后的逻辑

import requests
from bs4 import BeautifulSoup

page=requests.get('https://www.england.nhs.uk/statistics/statistical-work-areas/delayed-transfers-of-care/statistical-work-areas-delayed-transfers-of-care-delayed-transfers-of-care-data-2018-19/')

soup=BeautifulSoup(page.text,'html.parser')
text=soup.find(class_='rich-text')
head = text.find_all('h3')

for row in head:
    for r1 in ['January','February']:
        if r1 in row:
            print(row)
        else:
            continue

预期结果是 <h3>February 2019</h3> <h3>January 2019</h3>

我得到的结果不存在,因为什么也没打印出来

2 个答案:

答案 0 :(得分:2)

这是因为row不是字符串类型,而是<class 'bs4.element.Tag'>。因此in检查失败。

一种解决方法将强制检查中的字符串:

if r1 in str(row): # or row.text

代码

for row in head:
    for r1 in ['January','February']:
        if r1 in str(row):  # or row.text
            print(row)

我有意避免从elseif,因为这样做没有任何目的。

(可选)

for row in head:
    if any(r1 in row.text for r1 in ['January','February']):
        print(row)

答案 1 :(得分:1)

使用bs4 4.7.1获取DTOC每月出版物的另一种方式

import requests
from bs4 import BeautifulSoup as bs

url = 'https://www.england.nhs.uk/statistics/statistical-work-areas/delayed-transfers-of-care/statistical-work-areas-delayed-transfers-of-care-delayed-transfers-of-care-data-2018-19/'

r = requests.get(url)
soup = bs(r.content, 'lxml')
publications = [item.next_sibling.next_sibling.text for item in soup.select('#main-content p:has(+h3)')][1:]
print(publications)

对于页面:

#main-content p:has(+h3)

p标签的过滤器,其父元素的ID为main-content,具有相邻的同级h3标签。 [1:]会忽略返回列表中的第一项,因为这不是一个月,而是Statistical Press Notice标头