使用 python 抓取数据?
Posted
技术标签:
【中文标题】使用 python 抓取数据?【英文标题】:Web Scraping data using 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+"))
来捕获标签内的文本...
任何意见都将受到高度赞赏!
【问题讨论】:
【参考方案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。
【讨论】:
以上是关于使用 python 抓取数据?的主要内容,如果未能解决你的问题,请参考以下文章
使用 python 和 sqlite 进行网页抓取。如何有效存储抓取的数据?