Как остановить внутренний цикл и повторить весь цикл, включая внутренний - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу просканировать страницу с часто задаваемыми вопросами с использованием Beautifulsoup, но у меня возникли проблемы при печати данных.

, например:

Q: question1111

A: answer1111

Q: question2222

A: answer2222

for q in question:
    print(q)
    for a in answer:
        print(a)

вывод выглядит так:

question1111
answer1111
answer2222
question2222
answer1111
answer2222

то, что я хочу, таким образом:

question1111
answer1111
question2222
answer2222

Затем я пытаюсь использовать перерыв,

for q in question:
    print(q)
    for a in answer:
        print(a)
        break

вывод стал:

question1111
answer1111
question2222
answer1111

я попытался продолжить и пройти, все еще не работает

Есть ли способ запустить внутренний цикл один раз, а затем вернуться к внешнему циклу, повторяя ??

ДОБАВЛЕНО НИЖЕ

HTML выглядит так:

<div>
  <h4 class="mod-wysiwyg__small-heading">Question1</h4>
</div>
<div>
  <p class="mod-wysiwyg__text">Answer1... paragraph1</p>
</div>
<div>
  <p class="mod-wysiwyg__text">Answer1...paragraph2</p>
</div>
<div>
  <h4 class="mod-wysiwyg__small-heading">Question2</h4>
</div>
<div>
  <p class="mod-wysiwyg__text">Answer2</p>
</div>
    <div>
  <h4 class="mod-wysiwyg__small-heading">Question3</h4>
</div>

код для сканирования html:

if r.status_code == requests.codes.ok:
    soup = BeautifulSoup(r.text, 'html.parser')
    question = soup.find_all('h4', class_='mod-wysiwyg__small-heading')
    answer = soup.find_all('p', class_='mod-wysiwyg__text')

    for q, a in zip(question, answer):
        print("- - " + q.text[3:], file=open("output.txt",'a'))
        print("  - " + a.text, file=open("output.txt",'a'))

вывод выглядит так:

Question1
Answer1... paragraph1
Question2
Answer1...paragraph2
Question3
Answer2

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

, если каждый ответ и вопросы не заключены в блок div, перейдите к .parent и .find_next_sibling()

soup = BeautifulSoup(html, 'html.parser')
question = soup.find_all('h4', class_='mod-wysiwyg__small-heading')

for q in question:
  firstAnswer = q.parent.find_next_sibling('div').find('p') 
  # or
  # .find('p', class_="mod-wysiwyg__text")
  print(q.text)
  print(firstAnswer.text)
0 голосов
/ 15 декабря 2018

Перебирайте каждый вопрос, а затем перебирайте следующих братьев и сестер, чтобы собрать абзацы ответа, пока мы не дойдем до нового вопроса (потому что мы не хотим собирать ответы на следующий вопрос):

result = []

for question in soup.select("h4.mod-wysiwyg__small-heading"):
    paragraphs = []
    for sibling in question.parent.find_next_siblings("div"):
        if sibling.h4:  # new question, exit
            break

        answer = sibling.find('p', class_='mod-wysiwyg__text')
        if answer:
            paragraphs.append(answer.text)

    result.append((question.text, " ".join(paragraphs)))

Вывод для вашего образца HTML:

[(u'Question1', u'Answer1... paragraph1 Answer1...paragraph2'),
 (u'Question2', u'Answer2'),
 (u'Question3', '')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...