Веб-парсинг BeautifulSoup (Python) - PullRequest
0 голосов
/ 16 июня 2020

У меня есть сценарий записной книжки jupyter, извлекающий текст с веб-страницы и помещающий его в фрейм данных. Мне нужно получить каждую строку тега ("div",{"align":"justify"}): первая строка - это название больницы, вторая - адрес, третья - номер телефона, а четвертая - URL.

Я повторяю элемент <strong>, но это не сработало. С помощью приведенного ниже кода мне удалось получить только имя и странные пробелы после него.

from selenium import webdriver
from bs4 import BeautifulSoup as soup
import pandas as pd
from urllib.request import urlopen as uReq

myurl = 'http://arhiva.zdravlje.gov.rs/showelement.php?id=8464'

#opening up connection, grabbing the page
uClient = uReq(myurl)

#put content into a variable and close connection
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, 'html')

divTag = page_soup.findAll("div",{"align":"justify"})

#iterate over 'strong' tag and put into list
mylist = []
for tag in divTag:   
   # print(tag.text)
    hospital_name = tag.strong.get_text()
    mylist.append(str(hospital_name))
    print(hospital_name)

df = pd.DataFrame({'address':mylist})

Вот как выглядит mylist:

['Северно Бачки округ',
 'Дом здравља Бачка Топола \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0\xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0\xa0 \xa0 \xa0 \xa0 \xa0 \xa0\xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 \xa0 ',
 'Дом здравља Алибунар']

Вот образец раздела <div align="justify"> переменной page_soup (обратите внимание на пробелы):

<div align="justify"><div align="center"><hr/><strong>Северно Бачки округ<br/></strong><hr/><strong><br/></strong></div></div><div align="justify"><strong>Дом здравља Бачка Топола                                                                                                                                                                                                                                          </strong><br/>Адреса: Светог Стефана 1, Бачка Топола<br/>Број телефона: 024/715-425<br/>Званична интернет презентација: <a href="http://www.dzbt.co.rs/">www.dzbt.co.rs</a><br/><br/><strong>Дом здравља Мали Иђош</strong><br/>Адреса: Занатлијска 1, 24321 Мали Иђош<br/>Број телефона: 024/730-236<br/>Званична интернет презентација: <a href="http://www.dzmi.rs/">www.dzmi.rs<br/></a><br/><strong>Дом здравља Суботица</strong><br/>Адреса: Петефи Шандора 7, 24000 Суботица<br/>Број телефона: 024/600735<br/>Званична интернет презентација: <a href="http://domzdravlja.org.rs/">domzdravlja.org.rs<br/></a><br/><strong>Општа Болница Суботица</strong><br/>Адреса: Изворска 3, 24000 Суботица<

Заранее большое спасибо.

1 Ответ

0 голосов
/ 16 июня 2020

Анализ такого рода документов довольно сложен (кажется, что документ не сгенерирован машиной, а сгенерирован вручную).

Вы можете попробовать этот пример, чтобы получить все адреса в DataFrane:

import pandas as pd
from bs4 import BeautifulSoup as soup, Tag, Comment
from urllib.request import urlopen as uReq

myurl = 'http://arhiva.zdravlje.gov.rs/showelement.php?id=8464'

#opening up connection, grabbing the page
uClient = uReq(myurl)

#put content into a variable and close connection
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, 'html.parser')

all_strongs = page_soup.select('div[align="justify"] > strong:not(:contains("нема"))')
data = []
for s in all_strongs:
    out = ''
    n = s.next_sibling
    while n:
        if isinstance(n, Tag) and n.name == 'strong' and n in all_strongs:
            break
        if isinstance(n, Tag) and n.name == 'div' and 'align' in n.attrs and n['align'] == 'center':
            n = n.next_sibling
            continue
        if not isinstance(n, Comment):
            out += str(n)
        n = n.next_sibling

    data.append( BeautifulSoup(out, 'html.parser').get_text(strip=True, separator='\n') )

df = pd.DataFrame({'Text': data})
print(df)

Печать:

                                                  Text
0    Адреса: Светог Стефана 1, Бачка Топола\nБрој т...
1    Адреса: Занатлијска 1, 24321 Мали Иђош\nБрој т...
2    Адреса: Петефи Шандора 7, 24000 Суботица\nБрој...
3    Адреса: Изворска 3, 24000 Суботица\nБрој телеф...
4    Адреса: Матије Гупца 26, 24000 Суботица\nБрој ...
..                                                 ...
340  Адреса: Требевићка 16, 11030 Београд\nБрој тел...
341  Адреса: др Суботића 5, 11000 Београд\nБрој тел...
342  Адреса: Војводе Степе 458, 11152 Београд\nБрој...
343  Адреса: Стари град Булевар деспота Стефана 54а...
344  Адреса: 38252 Шилово\nБрој телефона:\nЗванична...

[345 rows x 1 columns]
...