Python - 使用请求和bs4进行超级简单的抓取

时间:2017-07-31 21:20:34

标签: python beautifulsoup python-requests

我正在尝试从此页面获取主表中的数据: https://www.interactivebrokers.com/en/index.php?f=2222&exch=globex&showcategories=FUTGRP#productbuffer

我试过了:

import requests
from bs4 import BeautifulSoup

address="https://www.interactivebrokers.com/en/index.php?f=2222&exch=globex&showcategories=FUTGRP#productbuffer"

r=requests.get(address)
soup=(r.text,"html_parser")

我知道这是超级基本但不知何故我被封锁了。

我尝试soup.find_all('table')但无法正确识别我正在寻找的表格(它似乎没有ID或可区分的属性)。

我试过soup.find_all('tr')然后我可以看到我正在寻找的行但结果中还有一些不需要的行,我不知道如何分开。

任何人都可以帮我完成第一步bs4吗?

1 个答案:

答案 0 :(得分:1)

似乎问题是,您想要的数据实际上位于表标记之外,但是位于tbody-tag中。该网站有3个。

所以抓住tds的工作代码看起来像这样:

import requests
from bs4 import BeautifulSoup

url = 'https://www.interactivebrokers.com/en/index.php?f=2222&exch=globex&showcategories=FUTGRP#productbuffer'
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
table = soup.find_all('tbody')[2]
trs = table.find_all('tr')

然后你只需要迭代trs来获取内容,你就可以了。 tds在一个包含四个元素的列表中。你是在nr。 0,2和3.通常你可以这样做。由于nr 1具有相同的链接文本('linkexternal'),我改为使用它。

outfile = r'C:\output_file.txt'
with open(outfile, 'a', encoding='utf-8') as fd:
    for tr in trs:
        try:
            tds = tr.find_all('td')
            print_elements = ",".join([td.text for td in tds if 'linkexternal' not in str(td)])
            fd.write(print_elements+'\n')
        except:
            #some exception handling, perhaps logging
            pass