我想从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
库。
答案 0 :(得分:1)
源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()
为您提供的网址运行时
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')