BeautifulSoup: Как извлечь <li>информацию в пределах <div> - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь извлечь li информацию в div с помощью BeautifulSoup.

Вот пример кода div, с которым я работаю:

<div class="list">
<a href="/name1" target="_blank" title="name1">
<img alt="name1" src="https://img.url.com/name1"/>
<ul>
<li>name1</li>
<li>fullname1</li>
</ul>
</a>
<a href="/name2" target="_blank" title="name2">
<img alt="name2" src="https://img.url.com/name2"/>
<ul>
<li>name2</li>
<li>fullname2</li>
</ul>
</a>
<a href="/name3" target="_blank" title="name3">
<img alt="name3" src="https://img.url.com/name3"/>
<ul>
<li>name3</li>
<li>fullname3</li>
</ul>
</a>
</div>

ЧтоЯ хотел бы сделать, это извлечь оба «имя» и «полное имя» текст из двух li.

Я думаю, что мне нужно создать цикл for для перебора списков, но я не уверен, как это сделать.(На самом деле, список длиннее, чем три записи).

Другая проблема, с которой я сталкиваюсь, заключается в том, как заставить суп различать первые <li>name<li> и вторые <li>fullname<li> теги.

Ваша помощь будет очень признательна!

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Предполагая, что ваши списки в этом div всегда будут следовать указанному выше формату, который вы можете искать по селекторам.Это создаст список чередующихся names и fullnames.

In [1]: from bs4 import BeautifulSoup as bs

In [2]: soup = bs(html, 'html.parser')

In [3]: target = soup.select('div ul li')
# search by selector

In [4]: target
Out[4]:
[<li>name1</li>,
 <li>fullname1</li>,
 <li>name2</li>,
 <li>fullname2</li>,
 <li>name3</li>,
 <li>fullname3</li>]

In [5]: names = [n.text for n in target[::2]]
# select every second element starting at the beginning of the list

In [6]: names
Out[6]: [u'name1', u'name2', u'name3']

In [7]: fullnames = [f.text for f in target[1::2]]
# select every second element starting at the second element of the list

In [8]: fullnames
Out[8]: [u'fullname1', u'fullname2', u'fullname3']
0 голосов
/ 28 мая 2018

Вы можете использовать вложенные понимания с BeautifulSoup:

from bs4 import BeautifulSoup as soup
_div = soup(content, 'html.parser').find('div', {'class':'list'})
results = [[i.text for i in b.find_all('li')] for b in _div.find_all('ul')]

Вывод:

[['name1', 'fullname1'], ['name2', 'fullname2'], ['name3', 'fullname3']]
...