2016-07-30 2 views
3

Я занимаюсь веб-сайтом с 122 различными страницами с 10 записями на страницу. При каждом запуске код разбивается на случайные страницы, на случайные записи. Я могу запустить код на url один раз, и он работает, а в других случаях он не работает.Различные результаты от BeautifulSoup каждый раз

def get_soup(url): 
    soup = BeautifulSoup(requests.get(url).content, 'html.parser') 
    return soup 

def from_soup(soup, myCellsList): 
    cellsList = soup.find_all('li', {'class' : 'product clearfix'}) 
    for i in range (len(cellsList)): 
     ottdDict = {} 
     ottdDict['Name'] = cellsList[i].h3.text.strip() 

Это только часть моего кода, но здесь происходит ошибка. Проблема в том, что когда я использую этот код, тэг h3 не всегда появляется в каждом элементе списка cellList. Это приводит к ошибке NoneType при запуске последней строки кода. Тем не менее, тег h3 всегда присутствует в HTML, когда я просматриваю веб-страницу.

cellsList vs html 1

same comparison made from subsequent soup request

Что может быть причиной этих различий, и как я могу избежать этой проблемы? Мне удалось запустить код успешно на время, и он, кажется, внезапно прекратил работать. Код способен царапать некоторые страницы без проблем, но он случайно не регистрирует h3-теги на случайных позициях на случайных страницах.

+0

Страница 1 из сайта, который выскоблил, можно найти на странице https://www.atcc.org/Products/Cells_and_Microorganisms/Cell_Lines/Human/Alphanumeric.aspx ?. –

+1

Вы пытались использовать парсер 'lxml'? – bernie

+0

Да, проблема все еще сохраняется даже с парсером lxml. –

ответ

2

В html имеются небольшие расхождения для различных элементов при продвижении по страницам сайта, лучший способ получить имя - это фактически выбрать внешний div и извлечь текст из привязки.

Это позволит получить всю информацию от каждого продукта и поместить его в dicts где ключи «Tissue», «Cell» и т.д .. и значения являются относящиеся descriptionm:

import requests 

from time import sleep 


def from_soup(url): 
    with requests.Session() as s: 
     s.headers.update({ 
      "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36"}) 
    # id for next oage anchor. 
    id_ = "#layoutcontent_2_middlecontent_0_threecolumncontent_0_content_ctl00_rptCenterColumn_dcpCenterColumn_0_ctl00_0_productRecords_0_bottomPaging_0_liNextPage_0" 

    soup = BeautifulSoup(s.get(url).content) 
    for li in soup.select("ul.product-list li.product.clearfix"): 
     name = li.select_one("div.product-header.clearfix a").text.strip() 
     d = {"name": name} 
     for div in li.select("div.search-item"): 
      k = div.strong.text 
      d[k.rstrip(":")] = " ".join(div.text.replace(k, "", 1).split()) 
     yield d 

    # get anchor for next page and loop until no longer there. 
    nxt = soup.select_one(id_) 

    # loop until mo more next page. 
    while nxt: 
     # sleep between requests 
     sleep(.5) 
     resp = s.get(nxt.a["href"]) 
     soup = BeautifulSoup(resp.content) 
     for li in soup.select("ul.product-list li.product.clearfix"): 
      name = li.select_one("div.product-header.clearfix a").text.strip() 
      d = {"name": name} 
      for div in li.select("div.search-item"): 
       k = div.strong.text 
       d[k.rstrip(":")] = " ".join(div.text.replace(k,"",1).split()) 
      yield d 

После бег:

for ind, h in enumerate(from_soup(
     "https://www.lgcstandards-atcc.org/Products/Cells_and_Microorganisms/Cell_Lines/Human/Alphanumeric.aspx?geo_country=gb")): 
    print(ind, h) 

Вы увидите 1211 dicts со всеми данными.

+0

Большое вам спасибо. Это очень похоже на то, что мне нужно. Похоже, что что-то отключено с помощью ключевой «ячейки». Ключ должен быть «тип ячейки» со значением «эпителиальный», например. Все остальное выглядит великолепно! Можете ли вы рассказать мне, откуда вы? –

+0

Да, раскол разделил ключ, я изменил логику, чтобы вытащить ключ из сильного ребенка и удалить его из значений, используя str.replace. U означает, что это строка в Юникоде, о чем не о чем беспокоиться, и если вы используете python3, вы бы вообще этого не увидели. –

+0

У меня, наконец, была возможность запустить ваш код. К сожалению, я получаю объект «NoneType», который не калибруется в строке 15. –

Смежные вопросы