Python Beautifulsoup找到特殊的标签文本

时间:2014-12-19 10:30:52

标签: python beautifulsoup

我正在努力寻找并将日期中的文本转换为系统日期,并将其作为变量用于其他地方。我正在寻找标签<span>中“标题”背后的日期。

我尝试了几种方法,但并没有真正提出一个简单的解决方案。最后我用了

modif_time = soup.find(text=re.compile('title'))

以下是HTML代码,其中包含信息。

 <a class="browser-fle yjax-lik" href="/mendonhall/mendonhall_adm/files/e0e854aaf54cb711f7335c8d8ecac9766cd175e3/tak/P0328_dummy.docx">P0328_dummy.docx</a>
     </td>
     <td>
         20.7 KiB
     </td>
     <td>
          application/vnd.openxmlformats-officedocument.wordprocessingml.document
     </td>
     <td>
             <div class="tool" title="tak directory">
              <pre>r28ee854af54c</pre>
             </div>
     </td>
     <td>
             <span class="tool" title="Fri, 19 Dec 2014 09:38:49">
            12 minutes and 48 seconds ago</span>
     </td>
     <td>
             <span title="id">
            xn06611 (Jeff Mendonhall)
            </span>
     </td>
</tr>

4 个答案:

答案 0 :(得分:3)

你想要

soup.find("span" title=True, class_='tool')

获取span代码的title属性的值。 title=True将结果限制为包含title属性的标记,class_='tool'进一步将结果限制为class属性值为'tool'的标记( class_中的下划线避免了与Python保留字的冲突。

您可以使用

将其转换为日期时间对象
import datetime
dt = datetime.strptime(soup.find("span" title=True, class_='tool')["title"], "%a, %d %b %Y %H:%M:%S")

答案 1 :(得分:1)

soup.find_all('span')查找HTML中的所有span标记。您可以通过指定关键字参数来further filter结果。

import email.utils as EU    
soup.find_all('span', title=EU.parsedate)

找到所有具有标题属性的span标记EU.parsedate 返回Truish值。

In [112]: EU.parsedate('Fri, 19 Dec 2014 09:38:49')
Out[112]: (2014, 12, 19, 9, 38, 49, 0, 1, -1)

当EU.parsedate无法解析标题时,它返回None(Falsish值)。

因此,soup.find_all('span', title=EU.parsedate)只查找标题属性看起来像日期的span标记。

然后,您可以使用datetime.datetime(*timetuple[:6])将EU.parsedate返回的时间元组转换为datetime.datetime


import bs4 as bs
import datetime as DT
import email.utils as EU    

soup = bs.BeautifulSoup(open('data'))
spans = soup.find_all('span', title=EU.parsedate)

for span in spans:
    print(span.attrs['title'])
    # Fri, 19 Dec 2014 09:38:49

    timetuple = EU.parsedate(span.attrs['title'])
    date = DT.datetime(*timetuple[:6])
    print(date)
    # 2014-12-19 09:38:49

答案 2 :(得分:0)

from datetime import datetime

...

span = soup.find('span')
title = span['title']
print datetime.strptime(title, '%a, %d %b %Y %H:%M:%S')

输出:

2014-12-19 09:38:49

答案 3 :(得分:0)

您将在下面找到如何获取所有span元素,并仅保留日期为“title”的元素。

import time
import requests
from bs4 import BeautifulSoup

html = requests.get(url).content   # url you're interested in 

soup = BeautifulSoup(html)
def is_date(x):
    try:
        time.strptime(x, "%a, %d %b %Y %H:%M:%S") # Try to transform string into
        return True                               # a datetime object
    except:
        return False
print is_date("Fri, 19 Dec 2014 09:38:49") # it prints True 

res = [s for s in soup.findAll('span', title=True) if is_date(s['title'])]
print res

这里印刷的是什么:

[<span class="tool" title="Fri, 19 Dec 2014 09:38:49">
           12 minutes and 48 seconds ago</span>]