2017-01-26 10 views
1

Я пытаюсь создать скребок, который собирает текст с веб-страницы. Я рассматриваю два конкретных div с разными именами классов («product-image» и «product-details»). Я просматриваю их, хватая текст от каждого тега «a» и «dd» внутри div.Объединение нескольких строк вывода в одну строку с помощью BeautifulSoup findAll с несколькими классами/тегами

Стоит отметить, что это первая программа, Python я когда-либо написанный ...

Вот мой код:

list_of_rows = [] 
for row in soup.findAll(True, {"class":["product-image", "product-details"]}): 
    list_of_cells = [] 
    for cell in row.findAll(['a', 'dd']): 
     text = cell.text.replace(' ', '') 
     list_of_cells.append(text) 
    list_of_rows.append(list_of_cells) 

Когда я распечатать list_of_rows, я получаю следующий результат для каждого прохода в цикле:

[цена]

[название] [автор], [издатель], [л], [л], [л]

[цена] поступает из блока «product-image» div. [название] и т. Д. происходит из блока div «product-details».

Так что, в принципе, findAll и цикл, который я написал, выводят разные строки для каждого блока div, который я просматриваю. Результат я хочу, чтобы одна строка вывода для обоего блоков, как это:

[цена], [название] [автор], [издатель], [л], [л], [ blah]

Есть ли способ сделать это в текущем потоке, который у меня есть, или мне нужно разбить его на несколько циклов, потянуть данные отдельно, а затем объединить? Я прошел через Q & A на StackOverflow и других сайтах, и хотя я могу найти экземпляры контуров findAll с несколькими классами, я не могу найти примеров того, как уменьшить вывод в одну строку.

Вот фрагмент с веб-страницы, которую я разбираю. Этот фрагмент кода появляется раза 1-й в HTML я разбор, где х количество продуктов на странице:

<div class="product-image"> 
    <a class="thumb" href="/Store/Details/life-on-the-screen/_/R-9780684833484B"><img src="http://images.bookdepot.com/covers/large/isbn978068/9780684833484-l.jpg" alt="" class="cover" /> 
     <div class="price "><span>$</span>2.25 
     </div> 
    </a> 
</div> 

<div class="product-details"> 
    <dl> 
     <dt><div class="nowrap"><span><a href="/Store/Details/life-on-the-screen/_/R-9780684833484B" title="Life On The Screen">Life On The Screen</a></span></div></dt> 
     <dd class="type"><div class="nowrap"><span><a href="/Store/Browse/turkle-sherry/_/N-4294697489/Ne-4">Turkle, Sherry</a></span></div></dd> 
     <dd class="type"><div class="nowrap"><a href="/Store/Browse/simon-and-schuster/_/N-4294151338/Ne-5">Simon and Schuster</a></div></dd> 
     <dd class="type">(Paperback)</dd> 
     <dd class="type">Computers &amp; Internet</dd> 
     <dd class="type">ISBN: 9780684833484</dd> 
     <dd>List $15.00 - Qty: 9</dd> 
      </dl> 
</div> 

Любых указатели или помощь очень ценится!

ответ

0

От вас вопрос, я придумал 2 результата. Я не уверен, что вы ищете ...Так что я отправляю как случаи

Первый случай - расширить список вместо добавления его

from bs4 import BeautifulSoup 
data = """<div class="product-image"> 
    <a class="thumb" href="/Store/Details/life-on-the-screen/_/R-9780684833484B"><img src="http://images.bookdepot.com/covers/large/isbn978068/9780684833484-l.jpg" alt="" class="cover" /> 
     <div class="price "><span>$</span>2.25 
     </div> 
    </a> 
</div> 

<div class="product-details"> 
    <dl> 
     <dt><div class="nowrap"><span><a href="/Store/Details/life-on-the-screen/_/R-9780684833484B" title="Life On The Screen">Life On The Screen</a></span></div></dt> 
     <dd class="type"><div class="nowrap"><span><a href="/Store/Browse/turkle-sherry/_/N-4294697489/Ne-4">Turkle, Sherry</a></span></div></dd> 
     <dd class="type"><div class="nowrap"><a href="/Store/Browse/simon-and-schuster/_/N-4294151338/Ne-5">Simon and Schuster</a></div></dd> 
     <dd class="type">(Paperback)</dd> 
     <dd class="type">Computers &amp; Internet</dd> 
     <dd class="type">ISBN: 9780684833484</dd> 
     <dd>List $15.00 - Qty: 9</dd> 
      </dl> 
</div>""" 

soup = BeautifulSoup(data,'lxml') 

list_of_rows = [] 
for row in soup.findAll(True, {"class":["product-image", "product-details"]}): 
    list_of_cells = [] 
    for cell in row.findAll(['a', 'dd']): 
     text = cell.text.replace('&nbsp;', '') 
     list_of_cells.append(text) 
    list_of_rows.extend(list_of_cells) 
print list_of_rows 

выход

[u'\n$2.25\n  \n', u'Life On The Screen', u'Turkle, Sherry', u'Turkle, Sherry', u'Simon and Schuster', u'Simon and Schuster', u'(Paperback)', u'Computers & Internet', u'ISBN: 9780684833484', u'List $15.00 - Qty: 9'] 

Второй случай - вам необходимо удалить новую строку знак из html текста

list_of_rows = [] 
for row in soup.findAll(True, {"class":["product-image", "product-details"]}): 
    list_of_cells = [] 
    for cell in row.findAll(['a', 'dd']): 
     text = cell.text.replace('&nbsp;', '') 
     list_of_cells.append(text.strip()) 
    list_of_rows.append(list_of_cells) 
print list_of_rows 

выход

[[u'$2.25'], [u'Life On The Screen', u'Turkle, Sherry', u'Turkle, Sherry', u'Simon and Schuster', u'Simon and Schuster', u'(Paperback)', u'Computers & Internet', u'ISBN: 9780684833484', u'List $15.00 - Qty: 9']] 
+0

Спасибо за ответ - я на самом деле удалили эту строку текста целиком из моего кода образца - это было только там для отладки, и я случайно оставил его в Что я в конечном итоге делает это выводя list_of_rows. к файлу .csv (я не стал включать этот код, потому что проблема не в том, чтобы записывать в csv, он находится в структуре list_of_rows, где каждый цикл имеет несколько строк, которые записываются для вывода вместо одного .) Надеюсь, я уточнил проблему - извините за случайный выход из кода отладки. –

+0

Вопрос немного запутанный, все еще придумал какое-то решение, дайте мне знать об этом работает для вас – Shijo

+0

Это работает отлично! Спасибо за помощь - я очень ценю это! –

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

  • Нет связанных вопросов^_^