首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网页抓取BeautifulSoup (Python)

网页抓取BeautifulSoup (Python)
EN

Stack Overflow用户
提问于 2020-06-16 17:41:14
回答 1查看 65关注 0票数 0

我有一个jupyter notebook脚本,从webpage中提取文本并将其放入数据帧中。我需要获取("div",{"align":"justify"})标记的每一行:第一行是医院名称,第二行是地址,第三行是电话号码,第四行是url。

我遍历了<strong>元素,但这并不起作用。使用下面的代码,我只能得到名字加上后面奇怪的空格。

代码语言:javascript
复制
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的样子:

代码语言:javascript
复制
['Северно Бачки округ',
 'Дом здравља Бачка Топола \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 ',
 'Дом здравља Алибунар']

以下是page_soup变量的<div align="justify">部分的示例(请注意空格):

代码语言:javascript
复制
<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 Суботица<

非常提前感谢您。

EN

回答 1

Stack Overflow用户

发布于 2020-06-16 19:48:40

解析这类文档相当困难(看起来文档不是机器生成的,而是手动生成的)。

您可以尝试使用此示例将所有地址获取到DataFrane:

代码语言:javascript
复制
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)

打印:

代码语言:javascript
复制
                                                  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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62405541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档