我尝试使用Beautiful soup解析this page的最后发布日期,其中 3天(选择字符串)。到目前为止我试过了:
lastPost = soup.find_all('dl', attrs={'dt': 'Last post', 'data-format': 'medium'})
但没有成功。所有其他标签和属性对于页面中的其他项目都是相同的。还
data-time="random digits"
不会起作用,因为它与不同页面/不同用户中的相同项目不同,最近将被解析。唯一重复和独特的是最后的帖子。 什么可以是检索上次发布日期的确切指针(发布此日期为3天)?
谢谢!
答案 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会根据该信息生成相对日期。