Есть ли какая-то причина, по которой мой оператор if для поиска текста в элементе тега bs4 не выполняется? - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь найти и напечатать все теги h3, которые содержат месяцы, которые меня интересуют. Для этого я попытался создать цикл for моего объекта bs4 (head) и оператор if внутри него, указав для выведите строку, которая удовлетворяет условию; что в этом случае будет, если строка (месяц) находится в строке. У меня проблема, даже если указанные месяцы существуют в объекте / строках bs4, они не печатаются в моем операторе if.

Я пытался добавить год к месяцам, и это, похоже, решило проблему, хотя и не идеально. Кроме того, я проверил логику моего метода, составив короткий список некоторых строк (вручную) и выполнив цикл for с этим списком вместо объекта bs4 (head)

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 ]

2 голосов
/ 20 апреля 2019

Это потому, что 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)

Я намеренно избегал от else до if, потому что это не имеет никакого значения.

По выбору,

for row in head:
    if any(r1 in row.text for r1 in ['January','February']):
        print(row)
1 голос
/ 20 апреля 2019

Другой способ получения ежемесячных публикаций DTOC с использованием bs4 4.7.1

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, с родителемэлемент с идентификатором main-content, имеющий соседний тег h3.[1:] игнорирует первый элемент в возвращенном списке, поскольку это не месяц, а Statistical Press Notice header

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...