我需要从每个html文件中获取日期。
我尝试了find_siblings(' p'),但返回None
。
日期位于以下标记下(主要是第三个p
标记),但有时会使用第一个标记id="a-body"
<div class="sa-art article-width" id="a-body" itemprop="articleBody">
<p class="p p1">text1</p>
<p class="p p1">text2</p>
<p class="p p1">
January 6, 2009 8:00 am ET
</p>
..
..
..
</div>
或
在第一个标记内,但包含其他信息。
<div class="sa-art article-width" id="a-body" itemprop="articleBody">
<p class="p p1">
participant text1 text2 text3 January 8, 2009 5:00 PM ET
</p>
<p class="p p1">text</p>
<p class="p p1">text</p>
..
..
</div>
我的代码只是找到第三个p
,但如果它在第一个p
内包含其他内容,我就不知道该怎么做:< / p>
fo = open('C:/Users/output1/4069369.html', "r")
soup = bs4.BeautifulSoup(fo, "lxml")
d_date = soup.find_all('p')[2]
print d_date.get_text(strip=True)
答案 0 :(得分:1)
问题是您必须找到p
元素date
,然后您可以使用月份列表,如下所示:
from bs4 import BeautifulSoup
div_test='<div class="sa-art article-width" id="a-body" itemprop="articleBody">\
<p class="p p1">text1</p>\
<p class="p p1">\
participant text1 text2 text3 January 8, 2009 5:00 a.m. EST\
</p>\
<p class="p p1">text2</p>\
<p class="p p1">\
January 6, 2009 8:00 pm ET\
</p></div>'
soup = BeautifulSoup(div_test, "lxml")
month_list = ['January','February','March','April','May','June','July','August','September','October','November','December']
def first_date_p():
for p in soup.find_all('p',{"class":"p p1"}):
for month in month_list:
if month in p.get_text():
first_date_p = p.get_text()
date_start= first_date_p.index(month)
date_text = first_date_p[date_start:]
return date_text
first_date_p()
无论元素位置如何,它都会输出第一个p
元素date
,换句话说,它包含月份:
u'January 8, 2009 5:00 a.m. EST'
答案 1 :(得分:0)
使用提供的代码实际上并不是很清楚真的发生了,但我想,你试图找到反对页面的根。试试它是否像这样工作:
d_date = soup.find_all('div', { "id" : "a-body" })[0].find_all("p")[0]
print d_date.get_text(strip=True)
<强>更新强>
for page in pages:
soup = BeautifulSoup(page,'html.parser')
if soup.find_all("p")[2].get_text():
d_date = soup.find_all("p")[2]
print d_date.get_text(strip=True)
else:
d_date = soup.find_all("p")[0]
print d_date.get_text(strip=True)
答案 2 :(得分:0)
最好确定要使用的唯一通用模式...如果您不能依赖标签的属性,为什么不使用字符串?每个日期都以 ET
结尾,因此请像这样使用此信息
tag_dates = soup.find_all(lambda t: str(t.string).endswith('ET'), string=True)
dates = [str(t.string) for t in tag_dates] # list of all dates