Почему этот цикл останавливается после первой итерации?

avatar
Void S
8 августа 2021 в 17:12
33
1
0

Мой код обращается к странице, где каждая строка может иметь или не иметь раскрывающийся список с дополнительной информацией.

У меня есть оператор try и exclude, чтобы проверить это.

Прекрасно работает в строке 1, но не в строке 2?

import requests
from bs4 import BeautifulSoup as bs
import re
import pandas as pd

gg=[]
r = requests.get('https://library.iaslc.org/conference-program?product_id=24&author=&category=&date=&session_type=&session=&presentation=&keyword=&available=&cme=&page=2')
soup = bs(r.text, 'lxml')
sessions = soup.select('#accordin > ul > li')

for session in sessions:
    jj=(session.select_one('h4').text)
    print(jj)
    sub_session = session.select('.sub_accordin_presentation')
    try:
        if sub_session:
            kk=([re.sub(r'[\n\s]+', ' ', i.text) for i in sub_session])
            print(kk)
    except:
        kk=' '
    dict={"Title":jj,"Sub":kk}
    gg.append(dict)

df=pd.DataFrame(gg)
df.to_csv('test2.csv')
Источник

Ответы (1)

avatar
Andrej Kesely
8 августа 2021 в 17:22
1

Чтобы получить все разделы + подразделы, попробуйте:

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

r = requests.get(
    "https://library.iaslc.org/conference-program?product_id=24&author=&category=&date=&session_type=&session=&presentation=&keyword=&available=&cme=&page=2"
)
soup = bs(r.text, "lxml")
sessions = soup.select("#accordin > ul > li")

gg = []
for session in sessions:
    jj = session.h4.get_text(strip=True, separator=" ")
    sub_sessions = session.select(".sub_accordin_presentation")

    if sub_sessions:
        for sub_session in sub_sessions:
            gg.append(
                {
                    "Title": jj,
                    "Sub": sub_session.h4.get_text(strip=True, separator=" "),
                }
            )
    else:
        gg.append(
            {
                "Title": jj,
                "Sub": "None",
            }
        )


df = pd.DataFrame(gg)
df.to_csv("data.csv", index=False)
print(df)

Отпечатки:

                                                                                                                                                                                                    Title                                                                                                                                                      Sub
0                                                                                            IS05 - Industry Symposium Sponsored by Amgen: Advancing Lung Cancer Treatment with Novel Therapeutic Targets                                                                                                                                                     None
1                                 IS06 - Industry Symposium Sponsored by Jazz Pharmaceuticals: Exploring a Treatment Option for Patients with Previously Treated Metastatic Small Cell Lung Cancer (SCLC)                                                                                                                                                     None
2                                                                                      IS07 - Satellite CME Symposium by Sanofi Genzyme: On the Frontline: Immunotherapeutic Approaches in Advanced NSCLC                                                                                                                                                     None
3                                                                                             PL02A - Plenary 2: Presidential Symposium (Rebroadcast) (Japanese, Mandarin, Spanish Translation Available)                          PL02A.01 - Durvalumab ± Tremelimumab + Chemotherapy as First-line Treatment for mNSCLC: Results from the Phase 3 POSEIDON Study
4                                                                                             PL02A - Plenary 2: Presidential Symposium (Rebroadcast) (Japanese, Mandarin, Spanish Translation Available)                                                                                                                                    PL02A.02 - Discussant
5                                                                                             PL02A - Plenary 2: Presidential Symposium (Rebroadcast) (Japanese, Mandarin, Spanish Translation Available)                              PL02A.03 - Lurbinectedin/doxorubicin versus CAV or Topotecan in Relapsed SCLC Patients: Phase III Randomized ATLANTIS Trial

...

и создает data.csv (скриншот из LibreOffice):

enter image description here

Void S
8 августа 2021 в 17:27
1

Прекрасный ! Сделано тоже очень аккуратно!

Void S
8 августа 2021 в 18:18
0

Кстати, можно ли узнать автора/время подсессии? в своей колонке?

Andrej Kesely
8 августа 2021 в 18:34
0

@VoidS Да, просто добавьте в словарь еще один ключ. Не забудьте также добавить значения "None" с новыми ключами, если подраздел не существует.

Void S
8 августа 2021 в 18:38
0

Красиво, понял. В вашем примере вы сделали - Sub": sub_session.h4.get_text, где h4 - это имя тега. Мой вопрос: всегда ли это должно быть имя тега? Я спрашиваю, потому что что, если есть несколько тегов с одним и тем же именем. Будет ли класс имя также работает?

Andrej Kesely
8 августа 2021 в 18:39
1

@VoidS Это всего лишь одна из форм выбора тега. Вы можете использовать .find или .select_one. Зависит от вас.