如何使用 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
</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
یوسف آباد، خیابان بیست و یکم، جنب پارک شفق، بیمارستان ترمیمی پلاستیک فک و صورت
我不确定终端上的打印输出是否正确,但是,此代码应该为正确配置的终端生成正确的文本。
我想从 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
</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
یوسف آباد، خیابان بیست و یکم، جنب پارک شفق، بیمارستان ترمیمی پلاستیک فک و صورت
我不确定终端上的打印输出是否正确,但是,此代码应该为正确配置的终端生成正确的文本。