Как игнорировать текст в том же div, но в другом классе в Python - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь извлечь дату с сайта. html код выглядит следующим образом

<div class="tcell" style="width:175px;">
 <!-- status icon and date -->
 <a name="post6425787"><img alt="Old" class="inlineimg" src="https://www.f150forum.com/images/statusicon/post_old.gif"/></a>
                    12-10-2019, 06:13 PM

                    <!-- / status icon and date -->
 </div>,
 <div class="tcell">Smawgunner</div>,
 <div class="tcell" style="width:175px;">
 <!-- status icon and date -->
 <a name="post6425799"><img alt="Old" class="inlineimg" src="https://www.f150forum.com/images/statusicon/post_old.gif"/></a>
                    12-10-2019, 06:18 PM

                    <!-- / status icon and date -->
 </div>,
 <div class="tcell">CKsBAT</div>

Я хочу извлечь только дату, игнорируя поля имени. Мой код выглядит следующим образом

date = posts.find_all(lambda tag: tag.name == 'div' and 
                                   tag.get('class') == ['tcell'])
for i in date:
    print(i.text)

Приведенный выше код дает как дату, так и имя. Как я могу получить только дату из кода HTML? Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 08 января 2020

Наиболее непосредственно вы можете использовать select и :nth-child(odd):

from bs4 import BeautifulSoup 

html = """
<div>
  <div class="tcell" style="width:175px;">
    <a name="post6425787">
      <img alt="Old" 
           class="inlineimg" 
           src="https://www.f150forum.com/images/statusicon/post_old.gif"
      />
    </a>
                       12-10-2019, 06:13 PM
  </div>,
  <div class="tcell">Smawgunner</div>,

  <div class="tcell" style="width:175px;">
    <a name="post6425799">
      <img alt="Old" 
           class="inlineimg" 
           src="https://www.f150forum.com/images/statusicon/post_old.gif"
      />
    </a>
                     12-10-2019, 06:18 PM
  </div>,
  <div class="tcell">CKsBAT</div>
</div>
"""

soup = BeautifulSoup(html, "lxml")

for x in soup.select("div.tcell:nth-child(odd)"):
    print(x.text.strip())

Вывод:

12-10-2019, 06:13 PM
12-10-2019, 06:18 PM

Если вам нужна точность, основанная на характере содержимого, вы можете использовать регулярное выражение, которое точно соответствует вашему формату даты (в окружении ничего, кроме пробелов; при необходимости ослабьте регулярное выражение):

import re

soup = BeautifulSoup(html, "lxml")
pattern = r"^\s*(\d\d-){2}\d{4}, \d\d:\d\d [AP]M\s*$"

for x in soup.find_all(text=re.compile(pattern)):
    print(x.strip())

Если ваш формат даты неопределенный, и вы хотите получить все, что может быть проанализировано как дата:

from dateutil.parser import parse as parse_date

soup = BeautifulSoup(html, "lxml")

def try_parse_date(s):
    try: return parse_date(s, fuzzy=True)
    except ValueError: pass

for x in soup.find_all(text=try_parse_date):
    print(x.strip())
0 голосов
/ 08 января 2020

Другой вариант:

date = soup.select('div.tcell>a')
for d in date:
   print(d.parent.text.strip())
0 голосов
/ 08 января 2020
from bs4 import BeautifulSoup

data = """<div class="tcell" style="width:175px;">
 <!-- status icon and date -->
 <a name="post6425787"><img alt="Old" class="inlineimg" src="https://www.f150forum.com/images/statusicon/post_old.gif"/></a>
                    12-10-2019, 06:13 PM

                    <!-- / status icon and date -->
 </div>,
 <div class="tcell">Smawgunner</div>,
 <div class="tcell" style="width:175px;">
 <!-- status icon and date -->
 <a name="post6425799"><img alt="Old" class="inlineimg" src="https://www.f150forum.com/images/statusicon/post_old.gif"/></a>
                    12-10-2019, 06:18 PM

                    <!-- / status icon and date -->
 </div>,
 <div class="tcell">CKsBAT</div>"""

soup = BeautifulSoup(data, 'html.parser')

for item in soup.findAll("div", {'class': 'tcell'}):
    item = item.get_text(strip=True)
    if item[0].isdigit():
        print(item)

Вывод:

12-10-2019, 06:13 PM
12-10-2019, 06:18 PM

Обратите внимание, что вы можете использовать, если PM или AM для более подробной информации c:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...