我有一个jupyter笔记本脚本,它从webpage中提取文本并将其放入数据框。我需要获取("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 Суботица<
非常感谢您。
答案 0 :(得分:0)
解析此类文档非常困难(似乎该文档不是机器生成的,而是手工生成的。)
您可以尝试通过以下示例将所有地址获取到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]