【问题标题】:BeautifulSoup: scraping and iteratingBeautifulSoup:抓取和迭代
【发布时间】:2014-11-02 21:48:53
【问题描述】:
>>> 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>

我需要通过href="SHW?FRST=1 迭代这个bs4.element.ResultSet25000(大约)。我有两个大问题:

  1. 查找om 只给我前10 条记录。
  2. 我需要建立一个文件,其中包含在搜索中抓取的“信息”(例如 Wambold von Umstadt, Anselm Kasimir, 1583-1647 (Zeit, Lebensdaten))

由于某种原因,我一直无法使用 Scrapy。我相信我可以在 BeautifulSoup 中找到解决方案。

【问题讨论】:

  • 你只想要href链接??
  • 实际上我需要的是与href链接相关的跨度,例如Theologia Germanica : Libellus Aureus Hoc Est Brevis Et Praegnans Quomodo Sit Exuendus Vetus Homo Induendusque Novus

标签: python web-scraping beautifulsoup iteration


【解决方案1】:

怎么样

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 属性),但它提供了有关如何进行解析的想法。

【讨论】:

  • 谢谢,这看起来不错,但是由于某种原因它重复了人们。正如我之前评论的那样,我需要与 href 链接相关的跨度。有什么建议吗?
  • 重复人是不是因为我的测试数据重复了人?我剪切并粘贴它。有数字前缀以允许区分。 span 你的意思是div
  • 您的问题中显示的数据中没有 span 标签。您可以编辑您的问题以包含它吗?
  • 太好了,我按照建议编辑了我的问题,现在显示了跨度。谢谢
【解决方案2】:

尝试使用:

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

看看它是否能解决您的计数问题。

对于第二个问题,对 om 列表中的每个元素使用 om.get_text()

【讨论】:

  • 谢谢。关于第一部分,您的建议给出了重复的条目。我真正需要的是达到跨度。
  • 只用soup.select("div > span")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 2016-06-19
  • 2014-10-02
相关资源
最近更新 更多