Как разобрать строку (значение даты в данном сценарии) после тег, используя python и beautifulsoup - PullRequest
1 голос
/ 02 августа 2020

В настоящее время я пытаюсь очистить веб-контент с помощью Python, BeautifulSoup.

после 1-го блока выполнения кода получил следующий результат -

<div class="some class name">
    <div>
        <h3>Situation reports January 2020</h3>
        <p>
            <a target="_blank" href="/docs/default-source/coronaviruse/situation-reports/20200802-covid-19-sitrep-195.pdf?sfvrsn=5e5da0c5_2">
                <strong>Situation report - 1</strong>
            </a>
            <br>Coronavirus&nbsp;disease 2019 (COVID-19)&nbsp;
            <br>21 January 2020
        </p>
    </div>
</div>

Снова после шага 2, результат будет следующим:

<p>
    <a href="/docs/default-source/coronaviruse/situation-reports/20200121-sitrep-1-2019-ncov.pdf?sfvrsn=20a99c10_4" target="_blank">
        <strong>Situation report - 1</strong>
    </a>
    <br/>Novel Coronavirus (2019-nCoV)
    <br/>21 January 2020
</p>

Я могу получить все и вся, кроме 21 января 2020 - что после tag.

код шага 2, как показано ниже,

all_items = contentpage.find_all('div', attrs = {'class': 'sf-content-block content-block'})

rowarray_list = []

for items in all_items:
#    print(items, end='\n'*10)
    situation_report = items.find("h3")
    if situation_report is not None:
        situation_report = situation_report.text

        more_items = items.find_all('div')
        for single_item in more_items:
#            print(single_item, end='\n'*10)
            child_item = single_item.find_all('p')
#            print(single_item.getText(), end='\n'*2)
#            print(single_item.next_element, end='\n'*2)
            
            for child in child_item:
                print(child.next_sibling, end='\n'*2)

записал приведенный ниже код

br_item = child.find_all('br')
for br in br_item:
    temp = br.next_sibling
    print(temp, end='\n'*2)

и получил результат как

введите описание изображения здесь

Я пытаюсь просто получить только значение даты. помогите пожалуйста!

Ответы [ 3 ]

2 голосов
/ 02 августа 2020

Похоже, вам просто нужен последний элемент внутри каждого тега «p». Попробуйте это:

for i in soup.find_all('div', attrs={'class':'sf-content-block content-block'}):
    if i.find('p'):
        print(i.find('p').contents[-1])
1 голос
/ 02 августа 2020

Другое решение:

import requests
from bs4 import BeautifulSoup


url = 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/situation-reports'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')

for block in soup.select('p:has(>strong, >a)'):
    print(block.get_text(strip=True, separator='|').split('|')[-1])

Печать:

2 August 2020
1 August 2020
31 July 2020
30 July 2020
29 July 2020
...and so on.
1 голос
/ 02 августа 2020

Попробуйте:

import requests

from  bs4 import BeautifulSoup
html = requests.get('https://www.who.int/emergencies/diseases/novel-coronavirus-2019/situation-reports')
soup = BeautifulSoup(html.text, 'html.parser')



for div in soup.select('div.sf-content-block.content-block div p br + br'):
    text = div.find_next(text=True)
    print(text.strip())

распечатает:

2 August 2020
1 August 2020
31 July 2020
30 July 2020
29 July 2020
28 July 2020
27 July 2020
26 July 2020
25 July 2020
24 July 2020
23 July 2020

.. и так далее ........

...