某些数据的唯一属性

时间:2014-05-27 20:09:09

标签: python beautifulsoup

我尝试使用Beautiful soup解析this page的最后发布日期,其中 3天(选择字符串)。到目前为止我试过了:

lastPost = soup.find_all('dl', attrs={'dt': 'Last post', 'data-format': 'medium'})

但没有成功。所有其他标签和属性对于页面中的其他项目都是相同的。还

data-time="random digits" 

不会起作用,因为它与不同页面/不同用户中的相同项目不同,最近将被解析。唯一重复和独特的是最后的帖子。 什么可以是检索上次发布日期的确切指针(发布此日期为3天)?

谢谢!

enter image description here

1 个答案:

答案 0 :(得分:1)

您正在寻找<span>课程。我会用CSS selector来挑选出来:

soup.select('div.secondary dd span.relative-date')[0].string

如果您特别想找到<dt>Last Post</dt>元素并找到相对于此的日期,则需要先单独搜索该元素:

import re

last_post = soup.find('dt', text=re.compile('Last Post'))
last_post.find_next_sibling('dd').span.string

请注意,find_all()过滤个别标记; attrs={'dt': 'Last post', 'data-format': 'medium'}过滤器表示:找到一个至少包含两个属性dt="Last post"data-format="medium"的标记;您要查找的标记没有dt属性。这是因为它是<span>标记,而不是<dl>标记。

总而言之,实际页面实际上并不包含HTML中的消息。相反,那些是通过AJAX加载的;页面加载http://try.discourse.org/user_actions.json?offset=0&username=discoursetestr1,其中包含实际消息:

>>> import requests
>>> r = requests.get('http://try.discourse.org/user_actions.json?offset=0&username=discoursetestr1')
>>> r.json()['user_actions'][0]
{u'post_number': 4, u'target_name': u'discourse', u'excerpt': u'test........ \n\n \n\nlkjlkjlkljlkj', u'uploaded_avatar_id': 319, u'target_username': u'discoursetestR1', u'user_id': 4489, u'title': u'My custom own topic', u'moderator_action': False, u'acting_user_id': 4489, u'acting_name': u'E Mosbat', u'topic_id': 279, u'hidden': False, u'username': u'eMosbat', u'acting_uploaded_avatar_id': 319, u'deleted': False, u'acting_avatar_template': u'/user_avatar/try.discourse.org/emosbat/{size}/319.png', u'slug': u'my-custom-own-topic', u'avatar_template': u'/user_avatar/try.discourse.org/emosbat/{size}/319.png', u'name': u'E Mosbat', u'created_at': u'2014-05-27T13:25:49.988Z', u'target_user_id': 4481, u'action_type': 9, u'acting_username': u'eMosbat', u'category_id': 2}
 >>> r.json()['user_actions'][0]['created_at']
 u'2014-05-27T13:25:49.988Z'

据推测,页面JavaScript会根据该信息生成相对日期。