A для l oop работает в Python, но работает в Django - PullRequest
0 голосов
/ 02 апреля 2020

Мне нужно разобрать теги h2 с сайта. Я использую BeautifulSoup

Вот часть Views.py. Я ищу все теги H2

from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests

def index(request):
    if request.method == "POST":
        url = request.POST.get('web_link', None)
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}#headers
        source=requests.get(url, headers=headers).text # url source
        #bs
        soup = BeautifulSoup(source, 'html.parser')


        # Title INFO
        title_num = soup.find_all('title')
        title_num = len(title_num)
        title = soup.title.text
        title_len = len(title)


        # H1 INFO
        h1_num = soup.find_all('h1')
        h1_num = len(h1_num)
        h1 = soup.h1.text

        # H2 INFO
        h2_all = soup.find_all('h2')
        h2_num = len(h2_all)

        return render(request, 'tags/django-bs.html', {
            'title':title,
            'title_len':title_len,
            'title_num':title_num,
            'h1_num':h1_num,
            'h1':h1,
            'h2_all':h2_all,
            'h2_num':h2_num,
            'h21':h21
            })

    return render(request, 'tags/django-bs.html')

Вот часть шаблона:

<h2>H2 info</h2>
      <table class="table">
        <thead>
          <tr>
            <th scope="col">#</th>
            <th scope="col">Test</th>
            <th scope="col">Value</th>
            <th scope="col">Result</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <th scope="row">1</th>
            <td>H2 quantity:</td>
            <td>{{ h2_num }}</td>
            <td>None</td>
          </tr>
          <tr>
            <th scope="row">3</th>
            <td>H2</td>
            <td>{{ h2_all }}</td>
            <td>None</td>
          </tr>
          <tr>
            <th scope="row">3</th>
            <td>H2 tags:</td>
            <td>
              {% for h2 in h2_all %}
                {{ h2 }}
              {% endfor %}
            </td>
            <td>E</td>
          </tr>
        </tbody>
      </table>

В части шаблона. Когда я пытаюсь отобразить h2_all - все работает. Результат: [<h2>Запись к врачу</h2>, <h2>Запись на диагностику</h2>]

Но когда я пытаюсь l oop получить каждый тег h2.

{% for h2 in h2_all %}
  {{ h2 }}
{% endfor %}

Результат следующий: [] []

Я новичок, и это мой первый проект на Django. Я уже потратил несколько часов, пытаясь решить проблему, но не дал результата ... Пожалуйста, помогите ...

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Вы пытаетесь преобразовать теги BeautifulSoup в строки перед передачей их в представление?

Вы можете использовать что-то вроде этого:

# H2 INFO
h2_all = soup.find_all('h2')
h2_all = [h.text for h in h2_all]

Это необходимо, потому что метод find_all() возвращает <class 'bs4.element.Tag'> объектов, которые нельзя представить в Django шаблонах.

0 голосов
/ 02 апреля 2020

Попробуйте:

{% for h2t in h2_all.get_text %}
  <h2>{{ h2t }}</h2>
{% endfor %}

если у вас в h2_all только 1 предмет, поэтому для l oop не будет работать

сколько предметов вы получите в h2_all?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...