Python bs4 Scraping, как найти определенный класс в списке и пропустить, но очистить остальные - PullRequest
0 голосов
/ 15 октября 2018

Я боролся с этим два дня.Существует определенный класс с именем «unCheck», который я не хочу импортировать в CSV.Я пробовал цикл IF и почти все, что приходило мне в голову, но я знаю, что я что-то пропускаю.

Кроме того, скрипт создает файл, но я не распределяю все в правильном формате, например, заголовки под заголовками, описание под описанием и т. Д. Я знаю кое-что, но не могу найти его: /

Забыл упомянуть, что это ссылка, которую я пытаюсь очистить (используя csv для всех ссылок на настоящем сайте) https://www.interhome.com/spain/barcelona/barcelona/apartment-placa-catalunya-rdauniversidad-es9510.90.1/?q=apartment%2bpla%25c3%25a7a%2bcatalunya%252frda.universidad%2b%25e2%2598%2585%25e2%2598%2585%25e2%2598%2585%25e2%2598%2585%252c%2bbarcelona

При прокрутке

можно увидеть объекты вниз
import requests
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

contents = []
with open('accomodation.csv', 'r') as csvf:
    urls = csv.reader(csvf)
    for url in urls:
        contents.append(url)


for url in contents:
    page = urlopen(url[0]).read()
    soup = BeautifulSoup(page, 'html.parser')
    accomodation = soup.findAll('div', {'class' : 'modAccommodationDetail'})
    file_path = 'scraping.csv'
    with open(file_path, "a") as csvf:
        accomodation = soup.findAll('div', {'class' : 'modAccommodationDetail'})
        for acom in accomodation:
            title = acom.findAll('h1' , {'class' : 'base'})[0].text
            print(title)
            rooms = acom.findAll('div', {'class' : 'personsRooms'})[0].text
            description = soup.findAll('div', {'class' : 'richtext'})
            paragraph1 = acom.findAll('div', {'class' : 'richtext'})[0].text
            print(paragraph1)
            facilities1 = acom.findAll('div', {'class' : 'attr c_third'})[0].text
            for unchecked in acom.find('ul', {'class' : 'attributelist'}):   #im trying to make an IF loop to find it and after that skip just the one with that atribute "unCheck"
                if unchecked.find('li', {'class' : 'unCheck'}:
                    continue
                else:
                    print(facilities1)
            facilities2 = acom.findAll('div', {'class' : 'attr c_third'})[1].text
            print(facilities2)
            distances = acom.findAll('div', {'class' : 'attr c_third'})[2].text
            print(distances)
            gallery = acom.find('ul', {'class' : 'object-thumb-list'}).findAll('a')
            for link in gallery:
                print(link['href'])
            print('\n')
            page_line = '{title}\n{rooms}\n{description}\n{facilities1}\n{facilities2}\n{distances}\n{gallery}\n\n'.format(
                title = title,
                rooms = rooms,
                description = description,
                facilities1 = facilities1,
                facilities2 = facilities2,
                distances = distances,
                gallery = link['href']
            )
        csvf.write(page_line)

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете просто игнорировать те элементы в списке, которые имеют класс:

print([li.text for li in acom.find('div', {'class' : 'attr c_third'}).findAll('li') if not li.has_attr('class')])

Вывод должен быть:

[u'TV ', u'Washing machine', «Посудомоечная машина», «Кондиционер», «Интернет (WiFi)»]

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