我有一系列类似“2014年12月27日星期六”的字符串,我想扔掉“星期六”并保存名为“141227”的文件,即年+月+日。到目前为止,一切都正常,除了我不能让daypos或yearpos的regex工作。它们都给出相同的错误:
回溯(最近一次调用):文件“scrapewaybacklog.py”,行
17,英寸
daypos=byline.find(re.compile(“[A-Z][A-Z]*\s”))类型错误:应为字符缓冲区对象
什么是字符缓冲区对象?那是不是说我的表情有问题?这是我的剧本:
for i in xrange(3, 1, -1):
page = urllib2.urlopen("http://web.archive.org/web/20090204221349/http://www.americansforprosperity.org/nationalblog?page={}".format(i))
soup = BeautifulSoup(page.read())
snippet = soup.find_all('div', attrs={'class': 'blog-box'})
for div in snippet:
byline = div.find('div', attrs={'class': 'date'}).text.encode('utf-8')
text = div.find('div', attrs={'class': 'right-box'}).text.encode('utf-8')
monthpos = byline.find(",")
daypos = byline.find(re.compile("[A-Z][a-z]*\s"))
yearpos = byline.find(re.compile("[A-Z][a-z]*\D\d*\w*\s"))
endpos = monthpos + len(byline)
month = byline[monthpos+1:daypos]
day = byline[daypos+0:yearpos]
year = byline[yearpos+2:endpos]
output_files_pathname = 'Data/' # path where output will go
new_filename = year + month + day + ".txt"
outfile = open(output_files_pathname + new_filename,'w')
outfile.write(date)
outfile.write("\n")
outfile.write(text)
outfile.close()
print "finished another url from page {}".format(i)
我也不知道如何使12月12日,但那是另一次。请帮我找准位置。
最佳答案
不是用regex解析日期字符串,而是用dateutil
解析它:
from dateutil.parser import parse
for div in soup.select('div.blog-box'):
byline = div.find('div', attrs={'class': 'date'}).text.encode('utf-8')
text = div.find('div', attrs={'class': 'right-box'}).text.encode('utf-8')
dt = parse(byline)
new_filename = "{dt.year}{dt.month}{dt.day}.txt".format(dt=dt)
...
或者,可以使用
datetime.strptime()
解析字符串,但需要注意suffixes:byline = re.sub(r"(?<=\d)(st|nd|rd|th)", "", byline)
dt = datetime.strptime(byline, '%A, %B %d %Y')
re.sub()
这里找到st
或nd
或rd
或th
字符串after a digit并用空字符串替换后缀。之后,日期字符串将匹配'%A, %B %d %Y'
格式,请参见:strftime() and strptime() Behavior
一些附加说明:
您可以将
urlopen()
的结果直接传递给BeautifulSoup
构造函数使用CSS Selector
find_all()
要加入系统路径,请使用
div.blog-box
处理文件时使用
os.path.join()
context manager固定版本:
import os
import urllib2
from bs4 import BeautifulSoup
from dateutil.parser import parse
for i in xrange(3, 1, -1):
page = urllib2.urlopen("http://web.archive.org/web/20090204221349/http://www.americansforprosperity.org/nationalblog?page={}".format(i))
soup = BeautifulSoup(page)
for div in soup.select('div.blog-box'):
byline = div.find('div', attrs={'class': 'date'}).text.encode('utf-8')
text = div.find('div', attrs={'class': 'right-box'}).text.encode('utf-8')
dt = parse(byline)
new_filename = "{dt.year}{dt.month}{dt.day}.txt".format(dt=dt)
with open(os.path.join('Data', new_filename), 'w') as outfile:
outfile.write(byline)
outfile.write("\n")
outfile.write(text)
print "finished another url from page {}".format(i)
关于python - 将Regex与BeautifulSoup结合使用可在Python中解析字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27672665/