BeautifulSoup заполнить недостающую информацию с помощью «NA» в CSV - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю над веб-шабером, который создает файл .csv со всеми химикатами на веб-сайте Sigma-Aldrich.Файл .csv будет иметь химическое название, за которым следуют такие переменные, как номер продукта, номер cas, молекулярный вес и химическая формула.1 химикат + информация в строке.

Проблема, с которой я столкнулся, заключается в том, что не у всех химикатов есть все поля, у многих есть только номера продуктов и касс.Это приводит к смещению моего файла .csv, а строки химикатов имеют неверную информацию, связанную с другим химическим веществом.

Чтобы исправить это неправильно, я хочу добавить 'N / A', если поле пустое.

Вот мой метод очистки:

def scraap(urlLi):
    for url in urlLi:
        content = requests.get(url).content
        soup = BeautifulSoup(content, 'lxml')
        containers = soup.find_all('div', {'class': 'productContainer-inner'})


        for c in containers:
            sub = c.find_all('div', {'class': 'productContainer-inner-content'})
            names = c.find_all('div', {'class': 'searchResultSubstanceBlock clearfix'})

            for n in names:
                hope = n.find("h2").text
                print(hope)
                nombres.append(hope.encode('utf-8'))

            for s in sub:
                info = s.find_all('ul', {'class': 'nonSynonymProperties'})
                proNum = s.find_all('div', {'class': 'product-listing-outer'})

                for p in proNum:
                    ping = p.find_all('div', {'class': 'row clearfix'})

                    for po in ping:
                        pro = p.find_all('li', {'class': 'productNumberValue'})
                        pnPp = []
                        for pri in pro:
                            potus = pri.get_text()
                            pnPp.append(potus.encode('utf-8'))

                    ProductNumber.append(pnPp)
                    print(pnPp)

                for i in info:
                    c = 1
                    for gling in i:
                        print(gling.get_text())
                        if c == 1:
                            formu.append(gling.get_text().encode('utf-8'))
                        elif c == 2:
                            molWei.append(gling.get_text().encode('utf-8'))
                        else:
                            casNum.append(gling.get_text().encode('utf-8'))

                        c += 1
                    c == 1
                    print("---")

Вот мой метод написания:

def pipeUp():

    with open('sigma_pipe_out.csv', mode='wb') as csv_file:
        fieldnames = ['chem_name', 'productNum', 'formula', 'molWei', 'casNum']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        # writer.writeheader()
        # csv_file.write(' '.join(fieldnames))
        for n, p, f, w, c in zip(nombres, ProductNumber, formu, molWei, casNum):
            # writer.writerow([n, p, f, w, c])
            writer.writerow({'chem_name': n, 'productNum': p, 'formula': f, 'molWei': w, 'casNum': c})

Проблема возникает в разделе get i from info :.Список formu, molWei и casNum отключен.

Как добавить «N / a», если в formu и molWei отсутствует информация?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

вы не можете использовать индекс в качестве проверки значения (if c == 1:), используйте проверку строки перед добавлением в список

замените:

for i in info:
    ....
    ....
print("---")

на:

rowNames = ['formu', 'molWei', 'casNum']

for li in info[0].find_all('li'):
    textVal = li.text.encode('utf-8')
    #print(textVal)
    if b'Formula' in textVal:
        formu.append(textVal)
        rowNames.remove('formu')
    elif b'Molecular' in textVal:
        molWei.append(textVal)
        rowNames.remove('molWei')
    else:
        casNum.append(textVal)
        rowNames.remove('casNum')

# add missing row here
if len(rowNames) > 1:
    for item in rowNames:
        globals()[item].append('NA')
print("---")
0 голосов
/ 28 ноября 2018

Я предполагаю, что get_text () возвращает пустую строку, если нет информации о формуле, молекулярной массе и т. Д. В этом случае вы можете просто добавить:

if not molWei: molWei = "N/A"

Какиеобновляет molWei до N / A, если строка пуста.

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