2015-06-14 11 views
0

我想從一個HTML文件中像這樣獲得div標籤位於數據(姓名,城市和地址):如何使用美化功能從特定類別的html標記中獲取數據?

<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庫。

>>> 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,讓您的標籤之間的文字:

+0

我得到的名字,但做這樣一些事情: ** name_b = soup1.find(「H4」) 兒童在name_b.children 名=小孩** H4僅在該頁面中使用一次,但有很多div標籤沒有特殊的ID,我不知道我有多少訪問它們。 – Mehdi

+0

你可以展示多個'div'是如何構造的,它會影響答案。 –

+0

你可以看到我在這裏抓取的網頁: http://goo.gl/sCXNp2 – Mehdi

回答

0

有源HTML幾個<h4>標籤,但只有一個與itemprop="name"屬性<h4>,這樣你就可以搜索第一。然後從那裏訪問剩餘的值。請注意,以下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 
یوسف آباد، خیابان بیست و یکم، جنب پارک شفق، بیمارستان ترمیمی پلاستیک فک و صورت 

我不知道打印的輸出在我的終端上是正確的,但是,此代碼應爲正確配置的終端生成正確的文本。

+0

我試圖名= div_tag.text.split() ,我得到這樣的結果: [U '\ u0628 \ u06cc \ u0645 \ u0627 \ u0631 \ u0633 \ u062a \ u0627 \ u0646',U'\ u062a \ u0647 \ u0631 \ u0627 \ u0646 \ u067e \ u0627 \ u0631 \ u0633',u'\ u062a \ u0647 \ u0631 \ u0627 \ u0646',u'-',u'\ u062a \ u0647 \ u0631 \ u0627 \ u0646',u '\ u062a \ u0647 \ u0631 \ u0627 \ u0646 \ u067e \ u0627 \ u0631 \ u0633 \ u060c',u'\ u0646 \ u0628 \ u0634',u'\ u0641 \ u0644 \ u06a9 \ u0647',u'\ u0633 \ u0648 \ u0645',u'\ u062a \ u0647 \ u0631 \ u0627 \ u0646 \ u067e \ u0627 \ u0631 \ u0633'] – Mehdi

+0

@Mehdi:我已經更新了我的答案。當您試圖對您的問題進行總結時,您沒有正確複製源HTML。省和城市的價值是''標籤的_children_,而不是兄弟姐妹。該地址是''標籤的兄弟。還有不止一個'

'標籤,但幸運的是隻有一個'itemprop =「name」'屬性。 – mhawke

+0

它工作正常,給我正是我想要的! :) 但是因爲我是新來的美麗的肥皂和當然ptyhon,我不明白是什麼發生的行名,省和城市有價值? – Mehdi

0

您可以通過內置lxml.html模塊做

>>> 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 
+0

謝謝Kasra,我的代碼是更大的HTML文檔的一部分,但我只想要一些特定的文本,我在問題 – Mehdi

+0

@Mehdi歡迎,在這種情況下只需使用'find_all'。 – Kasramvd

-1

如果h4只使用一次t母雞可以做到這一點 -

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

Downvoters請解釋! –

相關問題