在标记

时间:2017-02-15 09:15:04

标签: python regex python-3.x beautifulsoup web-crawler

我正在尝试抓取一个网站(dailystormer)进行研究,我遇到了一个难题。

这是我在python中的代码:

obj.url = url
opener = urllib.request.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open(url)
soup = BeautifulSoup(response, 'html.parser')
article = soup.find("div", { "class" : "entry" })
paragraphs = article.findAll("p")
date = soup.find("time", style=False)
if not date:
   print("Date problem")
   obj.date = datetime.datetime.strptime('June 23, 1912', '%B %d, %Y').strftime("%Y-%m-%d")
else:
   obj.date = datetime.datetime.strptime(date.text.strip(), '%B %d, %Y').strftime("%Y-%m-%d")

困难在于文章的发表日期。在一些文章中有一个标签time但在大多数旧文章中没有这样的标签。 所以我试图直接从文本中检索日期,但它可能会有所不同,有时文章的日期标题是这样的:

<p>July 11, 2013<br/>
<strong>Daily Stormer</strong><br/>
Andrew Anglin</p>

<p>Andrew Anglin<br/>
<strong>Daily Stormer</strong><br/>
July 11, 2013</p>

<p>Andrew Anglin<br/>
<strong>July 11, 2013</strong><br/>
Daily Stormer</p>

有时日期甚至不在这里。您可以直接看到一些示例:

One format

Another format

如果日期不存在,我怎样才能每个例子只检索日期或什么都没有?

2 个答案:

答案 0 :(得分:1)

从您的示例中,我假设日期始终采用相同的格式:"July 11, 2013"

了解这一点,您可以将正则表达式与datetime模块结合使用:

import re
import datetime

match = re.search(r'>([a-zA-Z].+ \d.+)<\/', text)
date = datetime.strptime(match.group(), '%B %d, %Y').date()

修改
我很确定我使用的正则表达式可以简化,我让你找到一个更好的解决方案。

答案 1 :(得分:1)

var str = '<p>July 11, 2013<br/><strong>Daily Stormer</strong><br/>Andrew Anglin</p>'; 
var matches = str.match(/>\S{3,} \d{2}, \d{4}/);

var date = '';
if(matches)
{
    date = matches[0].substring(1);
}
console.log('Published date: ',date);