【问题标题】:Web Scraping data using python?使用 python 抓取数据?
【发布时间】:2012-03-22 16:58:39
【问题描述】:

我刚开始学习使用 Python 进行网页抓取。但是,我已经遇到了一些问题。

我的目标是从 fishbase.org (http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=salmon) 上抓取不同金枪鱼物种的名称

问题:我无法提取所有物种名称。

这是我目前所拥有的:

import urllib2
from bs4 import BeautifulSoup

fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Tuna'
page = urllib2.urlopen(fish_url)

soup = BeautifulSoup(html_doc)

spans = soup.find_all(

从这里开始,我不知道如何提取物种名称。我想过使用正则表达式(即soup.find_all("a", text=re.compile("\d+\s+\d+")) 来捕获标签内的文本...

任何意见都将受到高度赞赏!

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    您不妨利用所有学名(并且只有学名)都在<i/> 标签中的事实:

    scientific_names = [it.text for it in soup.table.find_all('i')]
    

    使用 BS 和 RegEx 是解析网页的两种不同方法。前者存在,所以你不必为后者操心。

    您应该阅读 BS 的实际作用,似乎您低估了它的实用性。

    【讨论】:

      【解决方案2】:

      jozek 建议的是正确的方法,但我无法让他的 sn-p 工作(但这可能是因为我没有运行 BeautifulSoup 4 测试版)。对我有用的是:

      import urllib2
      from BeautifulSoup import BeautifulSoup
      
      fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Tuna'
      page = urllib2.urlopen(fish_url)
      
      soup = BeautifulSoup(page)
      
      scientific_names = [it.text for it in soup.table.findAll('i')]
      
      print scientific_names
      

      【讨论】:

      • 确实 findAll 已重命名为 find_all 以符合 pep8。更多信息here.
      【解决方案3】:

      查看网页,我不确定您要提取哪些信息。但是请注意,您可以使用text 属性轻松获取标签中的文本:

      >>> from bs4 import BeautifulSoup
      >>> html = '<a>some text</a>'
      >>> soup = BeautifulSoup(html)
      >>> [tag.text for tag in soup.find_all('a')]
      [u'some text']
      

      【讨论】:

        【解决方案4】:

        谢谢大家...我能够解决我在这段代码中遇到的问题:

        import urllib2
        from bs4 import BeautifulSoup
        
        fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Salmon'
        page = urllib2.urlopen(fish_url)
        html_doc = page.read()
        soup = BeautifulSoup(html_doc)
        
        scientific_names = [it.text for it in soup.table.find_all('i')]
        
        for item in scientific_names:
        print item
        

        【讨论】:

        • 别忘了接受对你帮助最大的答案作为正确答案。
        • ...因此将 Joe 的答案标记为正确答案是合适的...这有助于防止人们跳入答案,以为没有人为您解决问题。
        【解决方案5】:

        如果您想要长期解决方案,请尝试scrapy。它非常简单,并且为您做了很多工作。它是非常可定制和可扩展的。您将使用 xpath 提取所需的所有 URL,这更令人愉快和可靠。如果需要,scrapy 仍然允许您使用 re。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-23
          • 2020-12-05
          • 1970-01-01
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多