【问题标题】:How to scrape data selectively from tables in Python 2如何在 Python 2 中选择性地从表中抓取数据
【发布时间】:2016-01-22 19:14:54
【问题描述】:

我正在做我自己的一个小项目,并试图将我的注意力集中在网络抓取上。

我正在使用 Python 2 和 BeautifulSoap 模块(但也尝试了其他模块,尝试使用 re 模块等)。

简单地说,给定网站:http://www.bankofcanada.ca/rates/exchange/daily-closing-past-five-day/我想收集有关每种货币的汇率信息,但代码更灵活。

这是我的例子:

import urllib2
from bs4 import BeautifulSoup
import string
import re

myurl = 'http://www.bankofcanada.ca/rates/exchange/daily-closing-past-five-day/'
soup  = BeautifulSoup(urllib2.urlopen(myurl).read(), "lxml")

dataTables = soup.find_all('td')

brandNewList = []

for x in dataTables:
    text = x.get_text().strip()
    brandNewList.append(text)
    #print  text

for index, item in enumerate(brandNewList):
    if item == "U.S. dollar (close)":
        for item in brandNewList[index:6]:
            print item

它显示:

$ python crawler.py
U.S. dollar (close)
1.4530
1.4557
1.4559
1.4490
1.4279

所以,如你所见,我可以通过抓取“td”标签来显示每种货币对应的数据;如果我将“th”与“td”标签结合使用,我可以得到更具体的信息。 但是,如果我不想指定确切的字符串“U.S. Dollar (close)”,如何使脚本模式适应不同的网站? 例如,我想从终端仅输入“US”/“us”作为参数,脚本将根据列在不同网站上的命名方式独立返回与美元对应的值?

另外,我是 Python 的初学者,你能告诉我重写我的网络爬虫的更简洁的方法吗?感觉就像我用一种“愚蠢”的方式写的,主要是:)

【问题讨论】:

    标签: python python-2.7 web-scraping beautifulsoup


    【解决方案1】:

    如何让脚本模式适应不同的网站?

    不同的站点有非常不同的标记,在你的情况下创建一个通用且可靠的定位机制几乎是不可能的。根据您要抓取的网站数量,您可以使用EAFP approach 循环遍历不同的定位功能,直到您成功获得货币汇率。

    请注意,有些资源提供公共或私有 API,您实际上并不需要抓取它们。

    顺便说一句,您可以通过找到U.S. dollar (close) 标签并获取following td siblings 来改进您的代码:

    us_dollar_label = soup.find("td", text="U.S. dollar (close)")
    rates = [td.get_text() for td in us_dollar_label.find_next_siblings("td")]
    

    【讨论】:

    • 或者,很酷,我以前没有听说过 EAFP;今天学到了一些新东西:),谢谢
    • 或者,这很整洁 - 感谢 sn-p ;现在,这看起来更像是一种获取信息的 python 方式
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 2017-08-09
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多