Выберите несколько элементов тега с BeautifulSoup в Python - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть следующий html:

<html>
<body>
...
</article>
<article class="issue">
<div class="issue-nr">#39</div>
<div class="issue-date">
<time datetime="2018-04-29T07:30:02+01:00">Apr 29, 2018</time>
</div>
<div class="issue-title">
<h1>
<a href="/" rel="" target="" title="Title"><span class="subject">The... - #39</span>
<span class="description">
 –
Blah, Bleh, Blih ...
</span>
</a></h1>
</div>
</article>
<article class="issue">
<div class="issue-nr">#38</div>
<div class="issue-date">
<time datetime="2018-04-28T07:30:00+01:00">Apr 28, 2018</time>
</div>
<div class="issue-title">
<h1>
<a href="/" rel="" target="" title="Title"><span class="subject">The... - #38</span>
<span class="description">
 –
Blah, Bleh, Blih ...
</span>
</a></h1>
</div>
</article>
<article class="issue">
<div class="issue-nr">#37</div>
<div class="issue-date">
<time datetime="2018-04-27T07:30:02+01:00">Apr 27, 2018</time>
</div>
<div class="issue-title">
<h1>
<a href="/" rel="" target="" title="Title"><span class="subject">The... - #37</span>
<span class="description">
 –
Blah, Bleh, Blih ...
</span>
</a></h1>
</div>
</article>
...
</body>
</html>

Я хочу перебирать теги каждой статьи, и я действительно получаю:

from requests import get
from bs4 import BeautifulSoup

response = get("https://example.com")


soup = BeautifulSoup(response.text, "html.parser")
issues = soup.find_all("article", {"class": "issue"})

for issue in issues:
    print (issue)

И теперь я хочу выбрать из каждого тега статьитег span с классом 'description', но когда я вызываю 'issue.span', выбираю только первый найденный тег.

Есть предложения?

Заранее спасибо.

1 Ответ

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

Вы имеете в виду следующее.используя селекторы CSS в комбинации?Я использую комбинатор потомков , чтобы объединить селекторы так, чтобы вы получили span.description потомков article.issue.Этот способ написания означает, что вы получите описания только там, где они существуют, поэтому дополнительный тест не требуется.

from bs4 import BeautifulSoup

html = '''
<html>
<body>
...
</article>
<article class="issue">
<div class="issue-nr">#39</div>
<div class="issue-date">
<time datetime="2018-04-29T07:30:02+01:00">Apr 29, 2018</time>
</div>
<div class="issue-title">
<h1>
<a href="/" rel="" target="" title="Title"><span class="subject">The... - #39</span>
<span class="description">
 –
Blah, Bleh, Blih ...
</span>
</a></h1>
</div>
</article>
<article class="issue">
<div class="issue-nr">#38</div>
<div class="issue-date">
<time datetime="2018-04-28T07:30:00+01:00">Apr 28, 2018</time>
</div>
<div class="issue-title">
<h1>
<a href="/" rel="" target="" title="Title"><span class="subject">The... - #38</span>
<span class="description">
 –
Blah, Bleh, Blih ...
</span>
</a></h1>
</div>
</article>
<article class="issue">
<div class="issue-nr">#37</div>
<div class="issue-date">
<time datetime="2018-04-27T07:30:02+01:00">Apr 27, 2018</time>
</div>
<div class="issue-title">
<h1>
<a href="/" rel="" target="" title="Title"><span class="subject">The... - #37</span>
<span class="description">
 –
Blah, Bleh, Blih ...
</span>
</a></h1>
</div>
</article>
...
</body>
</html>
'''

soup = BeautifulSoup(html, "lxml")
descriptions = soup.select('article.issue span.description')
descriptions = [description.text for description in descriptions]
print(descriptions)

Результат:

enter image description here


Для вас вам нужно будет выбрать span.description из issue

print([issue.select('span.description') for issue in issues])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...