2014-11-02 111 views
-2
>>> soup = BeautifulSoup(html) 
>>> om = soup.find_all('td', {'class': 'rec_title_ppnlist'}) 
>>> om 
[<td class="rec_title_ppnlist"> 
<div><a class=" link_gen " href="SHW?FRST=1">Wambold von Umstadt, Anselm Kasimir, 1583-1647 (Zeit, Lebensdaten)</a></div> 
<div><span>Theologia Germanica : Libellus Aureus Hoc Est Brevis Et Praegnans Quomodo Sit Exuendus Vetus Homo Induendusque Novus</span></div> 
<div><span>Lipsiae : Walther, 1630 [i.e. 1730]</span></div> 
<div class="rec_sep"><img alt="" src="http://gsowww.gbv.de/images/gui/empty.gif" title="" border="" height="1" width="1"></div> 

BeautifulSoup:刮迭代

我需要通過href="SHW?FRST=125000(近似)來遍歷這個bs4.element.ResultSet。我有兩個大問題:

  1. 查找om只給出前10條記錄。
  2. 我需要建立一個文件與「信息」刮中搜索(例如Wambold von Umstadt, Anselm Kasimir, 1583-1647 (Zeit, Lebensdaten))

出於某種原因,我已經無法使用Scrapy,我相信我能找到BeautifulSoup的解決方案。

+0

你只需要href鏈接? – Hackaholic 2014-11-02 22:06:05

+0

其實我需要的是相關的HREF鏈接的跨度,例如神學。德國:Libellus黃色葡萄球菌特設預估短的Et Praegnans Quomodo坐Exuendus VETUS智人Induendusque諾瓦斯 user2278505 2014-11-02 23:19:17

回答

0

嘗試使用:

soup.find_all("td", class_="rec_title_ppnlist") 

,看看它是否修復您的問題計數

對於第二個問題使用。 om列表中的每個元素均爲om.get_text()

+0

謝謝。關於第一部分,你建議重複輸入。我真正需要的是達到跨度。 – user2278505 2014-11-03 00:06:20

+0

只需使用soup.select(「div> span」) – Maksim 2014-11-03 10:35:58

0

什麼

from bs4 import BeautifulSoup 
from urlparse import urlparse, parse_qs 

html = ''' 
<html> 
<body> 
<table> 
<tr> 
<td class="rec_title_ppnlist"> 
<div><a class=" link_gen " href="SHW?FRST=0">Wambold von Umstadt, Anselm Kasimir, 1583-1647 (Zeit, Lebensdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=1">Wambold von Umstadt, Anselm Kasimir, 1583-1647 (Zeit, Lebensdaten)</a></div> 
<div class="rec_sep"><img alt="" border="" height="1" src="http://gsowww.gbv.de/images/gui/empty.gif" title="" width="1"/></div> 
</td>, 
<td class="rec_title_ppnlist"> 
<div><a class=" link_gen " href="SHW?FRST=2">Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=2">Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div class="rec_sep"><img alt="" border="" height="1" src="http://gsowww.gbv.de/images/gui/empty.gif" title="" width="1"/></div>. 
<div><a class=" link_gen " href="SHW?FRST=3">Wambold von Umstadt, Anselm Kasimir, 1583-1647 (Zeit, Lebensdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=4">4Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=5">5Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=6">6Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=7">7Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=8">8Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=9">9Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=10">10Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=11">11Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=12">12Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=13">13Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=25000">13Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 
<div><a class=" link_gen " href="SHW?FRST=25001">13Vomelius, Cyprianus, 1535-1587 (Zeit, Wirkungsdaten)</a></div> 

</tr> 
</table> 
</html> 
''' 

soup = BeautifulSoup(html) 
tdefs = soup.find_all('td', {'class': 'rec_title_ppnlist'}) 

with open('data.txt', 'w') as outfile: 
    for tdef in tdefs: 
     links = tdef.find_all('a', {'class': 'link_gen'}) 
     for link in links: 
      url = urlparse(link['href']) 
      vals = url.query.split('=') 
      if vals[0] == 'FRST': 
       if(1 <= int(vals[1]) <= 25000): 
        print "%s %s" % (vals[1], link.get_text()) 
        outfile.write(link.get_text() + '\n') 

我敢肯定,它讀取查詢字符串可以做出更好的(urlparse.parse_qs返回列表的字典,覺得奇怪,我)的部分。

此代碼不檢查輸入數據的有效性(例如鏈接是否具有href屬性),但它提供了關於如何執行解析的想法。

+0

謝謝,這看起來不錯,但由於某種原因它重複了人。正如我之前評論過的,我需要與href鏈接相關的跨度。任何建議? – user2278505 2014-11-02 23:22:33

+0

它重複了人,因爲我的測試數據重複了人?我剪切並粘貼它。有數字作爲前綴來區分。 'span'你的意思是'div'? – 2014-11-03 00:22:32

+0

問題中顯示的數據中沒有span標籤。你可以編輯你的問題,包括它? – 2014-11-03 01:51:25