Мне нужно получить дату из каждого 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 с другим контентом, я не знаю, как это сделать:

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
Michael Lin 29 Май 2017 в 02:01

2 ответа

Лучший ответ

Дело в том, что вам нужно найти элемент 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
Tiny.D 29 Май 2017 в 08:38

С предоставленным кодом Это не совсем понятно, что на самом деле происходит, но я думаю, вы пытаетесь найти против корня страницы. попробуйте, если это работает так:

d_date = soup.find_all('div', { "id" : "a-body" })[0].find_all("p")[0] 
print d_date.get_text(strip=True)

< Сильный > Update :

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)
0
29 Май 2017 в 05:58