如何使用beautifulsoup从特定类的html标签中获取数据?

时间:2015-06-14 10:10:28

标签: python beautifulsoup scrape

我想从HTML文件中获取div标记中的数据(名称,城市和地址),如下所示:

<div class="mainInfoWrapper">
    <h4 itemprop="name">name</h4>
    <div>
        <a href="/Wiki/Province/Tehran"></a>
         city
        <a href="/Wiki/City/Tehran"></a>
         Address
    </div>
</div>

我不知道如何在特定标签中获取我想要的数据。 显然我正在使用python与beautifulsoup库。

3 个答案:

答案 0 :(得分:1)

源HTML中有多个<h4>标记,但只有一个<h4>具有itemprop="name"属性,因此您可以先搜索该标记。然后从那里访问剩余的值。请注意,从源页面正确地再现了以下HTML,而问题中的HTML不是:

from bs4 import BeautifulSoup

html = '''<div class="mainInfoWrapper">
    <h4 itemprop="name">            
        NAME
        &nbsp;                          

    </h4>                           
    <div>                           
        <a href="/Wiki/Province/Tehran">PROVINCE</a> - <a href="/Wiki/City/Tehran">CITY</a> ADDRESS
    </div>                          
</div>'''

soup = BeautifulSoup(html)
name_tag = soup.find('h4', itemprop='name')
addr_div = name_tag.find_next_sibling('div')
province_tag, city_tag = addr_div.find_all('a')

name, province, city = [t.text.strip() for t in name_tag, province_tag, city_tag]
address = city_tag.next_sibling.strip()

为您提供的网址运行时

import requests
from bs4 import BeautifulSoup

r = requests.get('http://goo.gl/sCXNp2')
soup = BeautifulSoup(r.content)
name_tag = soup.find('h4', itemprop='name')
addr_div = name_tag.find_next_sibling('div')
province_tag, city_tag = addr_div.find_all('a')

name, province, city = [t.text.strip() for t in name_tag, province_tag, city_tag]
address = city_tag.next_sibling.strip()

>>> print name
بیمارستان حضرت فاطمه (س)
>>> print province
تهران
>>> print city
تهران
>>> print address
یوسف آباد، خیابان بیست و یکم، جنب پارک شفق، بیمارستان ترمیمی پلاستیک فک و صورت

我不确定我的终端上的打印输出是否正确,但是,此代码应为正确配置的终端生成正确的文本。

答案 1 :(得分:0)

你可以使用内置的lxml.html模块:

来实现
>>> s="""<div class="mainInfoWrapper">
...     <h4 itemprop="name">name</h4>
...     <div>
...         <a href="/Wiki/Province/Tehran"></a>
...          city
...         <a href="/Wiki/City/Tehran"></a>
...          Address
...     </div>
... </div>"""
>>> 
>>> import lxml.html
>>> document = lxml.html.document_fromstring(s)
>>> print document.text_content().split()
['name', 'city', 'Address']

使用BeautifulSoup获取标记之间的文字:

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(s)
>>> print soup.text

要获取特定代码的文字,请使用soup.find_all

soup = BeautifulSoup(your_HTML_source)
for line in soup.find_all('div',attrs={"class" : "mainInfoWrapper"}):
    print line.text

答案 2 :(得分:-1)

如果h4只使用一次,那么你可以这样做 -

name = soup.find('h4', attrs={'itemprop': 'name'})
print name.text
parentdiv = name.find_parent('div', class_='mainInfoWrapper')
cityaddressdiv = name.find_next_sibling('div')