Извлечение тегов с помощью select_one

#python #web-scraping #beautifulsoup #css-selectors

#python #очистка веб-страниц #beautifulsoup #css-селекторы

Вопрос:

Я пытаюсь извлечь содержимое из определенных тегов с помощью CSS-селектора в Python с этой страницы: https://scenarieconomici.it/page/898 /

В частности, мне интересны заголовок, дата, автор, категория и краткое содержание. Я попробовал следующим образом:

     print(tag.select_one(".entry-title").text)
    print(tag.select_one("span.meta-time").text)
    print(tag.select_one("span.meta-author").text)
    print(tag.select_one("span.category-item").text)
    print(tag.find_next(class_="entry-content").text.strip())  
  

Не могли бы вы сказать мне, правы ли они? При необходимости я мог бы предоставить вам весь код, который я использую.

Большое спасибо


После приведенного ниже ответа Wasif я изменил свой код, но, к сожалению, кажется, что проблема с тегами все еще существует:

 import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
import pandas as pd

def main(req, num):
    r = req.get("https://scenarieconomici.it/page/{}/".format(num))
    # r = req.get("https://www.imolaoggi.it/category/polit/page/{}/".format(num))
    soup = BeautifulSoup(r.content, 'html.parser')
    #goal = [(x.time.text, x.h3.a.text, x.select_one("span.cat-links").get_text(strip=True), x.p.get_text(strip=True))
     #       for x in soup.select("div.site-content")]
    for tag in soup.select('div', class_='entry-blog'):
        print(tag.find('span',class_='entry-title'))
        print(tag.find('span',class_='meta-time'))
        print(tag.find('span',class_='meta-author'))
        print(tag.find('span',class_='category-item'))
        print(tag.find_next(class_='entry-content'))
    return tag.find('span',class_='entry-title'),tag.find('span',class_='meta-time'), tag.find('span',class_='meta-author'), tag.find('span',class_='category-item'), tag.find_next(class_='entry-content')

with ThreadPoolExecutor(max_workers=30) as executor:
    with requests.Session() as req:
        # fs = [executor.submit(main, req, num) for num in range(1, 2937)]
        fs = [executor.submit(main, req, num) for num in range(1, 2)]
        allin = []
        for f in fs:
            allin.append(f.result())
        df = pd.DataFrame.from_records(
            allin, columns=["Title", "Time", "Author", "Category", "Content"])
       
  

поскольку я получаю только значения None.

Ответ №1:

 import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
from itertools import repeat
import re
import pandas as pd


def main(req, num):
    r = req.get("https://scenarieconomici.it/page/{}/".format(num))
    soup = BeautifulSoup(r.content, 'html.parser')
    return [(
            x.select_one("h2.entry-title").text,
            x.select_one("span.meta-time").text,
            x.select_one("span.meta-author").a.text,
            x.select_one("span.category-item").a.text,
            x.select_one("div.entry-content").p.text
            )
            for x in soup.findAll("article", id=re.compile(r"post-d "))]


with ThreadPoolExecutor(max_workers=50) as executor:
    with requests.Session() as req:
        fs = executor.map(main, repeat(req), range(1, 899))
        final = []
        [final.extend(f) for f in fs]
        df = pd.DataFrame.from_records(
            final, columns=["Title", "Time", "Author", "Category", "Content"])
        print(df)
  

Вывод

                                                    Title              Time  ...         Category                                            Content
0      LA SOLUZIONE DEL TEAM BIDEN PER IL COVID: MORI...  11 Novembre 2020  ...       attualita'  Ezekiel Emanuel Biden ha gia fatto partire i s...
1      10 Procuratori Statali con Trump, contro la Pe...  11 Novembre 2020  ...       attualita'  I procuratori generali del Missouri, Alabama, ...
2      TAGLIARE L’IVA: rilanciare l’economia ed incre...  11 Novembre 2020  ...       attualita'  Ieri Salvini e Bagnai hanno presentato il pian...
3      Il Parlamento Europeo? Incrementa i vincoli su...  10 Novembre 2020  ...       attualita'  Lunedì in commissione ECON è  stato  discusso ...
4      Dove siete finiti, cari rigoristi dell’austeri...  10 Novembre 2020  ...  analisi e studi  Dove siete finiti, detrattori della spesa pubb...
...                                                  ...               ...  ...              ...                                                ...
17941     Analisi della CRISI attuale: la GUERRA incombe  12 Novembre 2011  ...    Uncategorized  10 domande e 10 rispostePerche’ gli spread tra...
17942  SEMPLICE CRISI FINANZIARIA O TERZA GUERRA MOND...    12 Luglio 2011  ...    Uncategorized  Intervista immaginaria a Frank (che spiega per...
17943  SLIDING DOORS: “SIAMO L’UNICO PAESE DEL MONDO ...    12 Giugno 2011  ...    Uncategorized  Spesso siamo portati a criticare, a lamentarci...
17944             L’origine del DEBITO PUBBLICO Italiano    12 Giugno 2011  ...    Uncategorized  Spesso ci si chiede la vera origine del nostro...
17945                              La caduta dei Giganti    12 Giugno 2011  ...    Uncategorized  Vorrei soffermarmi un’istante sui 3 paesi card...

[17946 rows x 5 columns]
  

Комментарии:

1. спасибо вам за ваш ответ. можете ли вы объяснить, почему требуется id=re.compile(r»post-d «)?

2. @Math добро пожаловать, рад помочь. раньше я получал сообщения, где x — цифры. re post-x но вы могли бы просто использовать soup.select("article[id^='post-']") , если вы не знакомы с regex

3. большое спасибо за объяснение. Действительно оценил это.

Ответ №2:

Почему бы не использовать .find() вместо:

 print(tag.find('span',class_='your class'))
  

Комментарии:

1. Спасибо Васиф Хасан. Я тоже пробовал с этим, но я думаю, что на данный момент есть некоторые проблемы с выбором тегов. Не могли бы вы подтвердить, что выбранные мной теги и классы являются правильными?

2. Извините, я буду отключен на несколько часов, вы можете просто открыть URL-адрес в браузере, щелкнуть правой кнопкой мыши по элементам, а затем нажать «Проверить». И тогда вы можете получить классы тегов

3. нп, Васиф. Да, это то, что я уже сделал. Я использую Chrome и Inspect для выбора классов тегов