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

How can I get data from a specific class of a html tag using beautifulsoup?

我想从 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 库。

您可以使用内置的 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

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

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

来源 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()

当 运行 为您提供的 URL 时

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
یوسف آباد، خیابان بیست و یکم، جنب پارک شفق، بیمارستان ترمیمی پلاستیک فک و صورت

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