【问题标题】:Web scraping BeautifulSoup (Python)网页抓取 BeautifulSoup (Python)
【发布时间】:2020-06-16 09:41:14
【问题描述】:

我有一个 jupyter notebook 脚本,它从 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 ',
 'Дом здравља Алибунар']

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

<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 Суботица<

非常感谢您。

【问题讨论】:


  • 是一个 void 元素,因此它没有结束标记。
  • 谢谢我改写了这个问题

标签: python web-scraping beautifulsoup


【解决方案1】:

解析这种文档比较难(好像文档不是机器生成的,而是手工生成的)。

你可以试试这个例子来获取所有地址到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]

【讨论】:

  • 谢谢,已经好多了。现在我必须弄清楚如何解析各个行
  • @KimberlyClemons 你可以做print( BeautifulSoup(out, 'html.parser').get_text(strip=True, separator='|').split('|') )。但正如我所说,文档的结构不是很好,因此您必须对数据进行额外的后处理。
  • 你能帮我得到每家医院的名字吗?粗体字的。如果我取出 > strong:not(:contains("нема"))') 它只会获取空格之前的名称。
猜你喜欢
  • 2018-04-25
  • 2014-06-20
  • 1970-01-01
  • 2014-06-20
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
相关资源
最近更新 更多