【发布时间】:2020-09-13 16:29:42
【问题描述】:
我正在使用 Python 抓取网站,但在提取日期和使用正则表达式创建新的 Date 数据框时遇到了麻烦。
以下代码使用 BeautifulSoup 来抓取事件数据和事件链接:
import pandas as pd
import bs4 as bs
import urllib.request
source = urllib.request.urlopen('https://www.techmeme.com/events').read()
soup = bs.BeautifulSoup(source,'html.parser')
event = []
links = []
# ---Event Data---
for a in soup.find_all('a'):
event.append(a.text)
df_event = pd.DataFrame(event)
df_event.columns = ['Event']
df_event = df_event.iloc[1:]
# ---Links---
for a in soup.find_all('a', href=True):
if a.text:
links.append(a['href'])
df_link = pd.DataFrame(links)
df_link.columns = ['Links']
# ---Combines dfs---
df = pd.concat([df_event.reset_index(drop=True),df_link.reset_index(drop=True)],sort=False, axis=1)
在每个事件数据行的开头,都有日期。示例:(5 月 26-29 日增强型世博会...)。日期遵循以下格式,并且我已经包含了我的正则表达式(我认为这是正确的)。
Different Date Formats:
May 27: [A-Z][a-z]*(\ )[0-9]{1,2}
May 26-29: [A-Z][a-z]*(\ )[0-9]{1,2}-[0-9]{1,2}
May 28-Jun 2: [A-Z][a-z]*(\ )[0-9]{1,2}-[A-Z][a-z]*(\ )[0-9]{1,2}
Combined
[A-Z][a-z]*(\ )[0-9]{1,2}|[A-Z][a-z]*(\ )[0-9]{1,2}-[0-9]{1,2}|[A-Z][a-z]*(\ )[0-9]{1,2}-[A-Z][a-z]*(\ )[0-9]{1,2}
当我尝试使用正则表达式创建新列并提取日期时,我只收到一个空的 df['Date'] 列。
df['Date'] = df['Event'].str.extract(r[A-Z][a-z]*(\ )[0-9]{1,2}')
df.head()
任何帮助将不胜感激!谢谢。
【问题讨论】:
-
本题提供的信息够你stackoverflow.com/a/62009216/12239523。我认为它是相似的,但我可能是错的
标签: python python-3.x regex pandas