正则表达式使用BeautifulSoup从网站中提取日期

时间:2017-02-07 23:22:45

标签: python web-scraping beautifulsoup

我使用beautifulsoup从以下网站上抓取内容:

from bs4 import BeautifulSoup 
import requests
import re

dat   = re.compile("Berlin, \d{2}. \w+\b \d{4}")
url   = 'https://www.alternativefuer.de/gauland-scheinbares-umdenken-der-altparteien-ist-blanker-opportunismus/'
r     = requests.get(url)
soup  = BeautifulSoup(r.content, 'lxml')

data  = soup.find('div',attrs={'id':'content','role':'main'})

text  = data.findNext("div").text

然后我想提取字符串开头的日期。所以我试过了两个

date  = data.findAll(text=re.compile("Berlin, \d{2}. \w+\b \d{4}"))

date  = dat.match(text)

如果我将字符串复制到python正则表达式确实匹配日期。但是这两种选择似乎都不起作用。有人能指出我的问题所在吗?谢谢!

2 个答案:

答案 0 :(得分:2)

假设您的网页抓取正确收集数据,您抓取的字符串看起来像"Berlin, 30. November 2016.",所以......

>>> import re
>>> string = "Berlin, 30. November 2016."
>>> res = re.search("(\d+).+?(\w+).+?(\d+)", string)
>>> res.group(1)
'30'
>>> res.group(2)
'November'
>>> res.group(3)
'2016'
  • 您只需要使用()将所需的字词/数字括起来,以便稍后抓取匹配组。或者你可以使用findall,但因为你只想要一个匹配,所以这太过分了。
  • 如果您不想要每个组,只需使用res.group()使用相同的模式即可获得整个匹配。

答案 1 :(得分:2)

变化

dat   = re.compile("Berlin, \d{2}. \w+\b \d{4}")

dat   = re.compile("Berlin, \d{2}\. \w+ \d{4}")

转义正则表达式中的关键字.,然后删除\b,不需要使用它。

变化

date  = dat.match(text)

date  = dat.search(text)

text\nBerlin, 30. November 2016. Zum s....开头,开头有一个新行,match将从\n开始,将其更改为search