使用Beautiful Soup获取span title属性

时间:2018-01-20 05:21:39

标签: python html web-scraping beautifulsoup

我是python和Beautiful soup的新手,但我正在研究一个可以从这个网站获取数据的网络抓取工具:

http://yiimp.eu/site/tx?address=DFc6oo4CAemHF4KerLG39318E1KciTs742

网页非常简单,基本上只是一张桌子,所以我只想抓住表格中的每个字段。我的问题是,对于第一个字段,我试图实际获取span title中的日期而不是显示的实际值。我可以获取span titles的列表,或者我可以从其他两个字段中获取其他信息,但我无法同时获取范围标题和其他两个字段。以下是我试图完成的一个例子:

2018-01-20 03:37:00
3.90135252
8ece3baba44382eec3d62fa76b5beba98ae398f81ad2d77556b95c3c1a739b4f

相反,我能做到的最好的是

{'title': '2018-01-20 03:57:00'}
2h ago
{'title': '2018-01-20 03:57:00'}
3.90135252
{'title': '2018-01-20 03:57:00'}
8ece3baba44382eec3d62fa76b5beba98ae398f81ad2d77556b95c3c1a739b4f

这很接近,但遗憾的是它复制了标题时间,将标题标记保留在输出中,它实际上只是为每条记录重复相同的日期和时间。实现我正在寻找的结果的最佳方法是什么?

这是我的代码

import requests
import time
from bs4 import BeautifulSoup

theurl = "http://yiimp.eu/site/tx?address=DFc6oo4CAemHF4KerLG39318E1KciTs742"
thepage = requests.get(theurl, headers={'User-Agent':'MyAgent'})
soup = BeautifulSoup(thepage.text, "html.parser")


for table in soup.findAll('td'):
    print(table.text)
    for time in soup.findAll('span'):
        print(time.attrs)
        count =  1
        if count == 1:
            count ==0
            break

1 个答案:

答案 0 :(得分:1)

尝试使用此方法获取所有行的值:

for row in soup.find_all('tr', {'class': 'ssrow', 'style': None}):
    time = row.find('span')['title']
    amount = row.find('td', {'align': 'right'}).find('b').text
    tx = row.find('a').text
    # Print these values however you want.

检查第一行的代码:

row = soup.find('tr', {'class': 'ssrow', 'style': None})
time = row.find('span')['title']
amount = row.find('td', {'align': 'right'}).find('b').text
tx = row.find('a').text
print(time, amount, tx)

输出:

2018-01-20 06:56:43 4.42507599 d142445fd36e6a141a18071110faa8f6f3f9f8a42de888a149d8aa9416fe83ce

说明:

所有行都包含在<tr>标记中,但第一个<tr>标记用于标题。为了对其进行过滤,我添加了属性'class': 'ssrow',因为所有其他行都具有该属性。但是,如果您可以看到最后一行,则其<tr>标记包含style="border-top: 2px solid #eee;"。为了过滤掉,我添加了'style': None