Очистка страницы с BeautifulSoup дает странные результаты (несколько </p> в конце). Зачем? - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь очистить страницу с помощью BeautifulSoup. Я хотел бы сохранить теги <p></p> для последующего хранения содержимого в файлах .xml, разделенных на абзацы, заголовки и т. Д. К сожалению, результат меня немного удивляет. Вот как это выглядит:

enter image description here

Почему так много </p></p> в конце? Я привык к структуре, которая выглядит примерно так:

<p>some paragraph... </p>
<p>next paragraph... </p>

Не так:

some paragraph... <p>
next paragraph... <p></p>
</p>

Когда я проверяю структуру HTML в Chrome, все выглядит нормально:

enter image description here

Почему это происходит? Вот мой код:

import os
import requests
from bs4 import BeautifulSoup

payload = {
'username': os.environ['POLITYKA_USERNAME'],
'password': os.environ['POLITYKA_PASSWORD'],
'login_success': 'http://archiwum.polityka.pl',
'login_error': 'https://archiwum.polityka.pl/art/grypa-nam 
niestraszna,378836.html'
}

login_url = 'https://www.polityka.pl/sso/login'
base_url = 'http://archiwum.polityka.pl'
example_url = 'https://archiwum.polityka.pl/art/sciganie- 
wnbsp;organach,378798.html'
with requests.Session() as session:
    session.headers={'User-Agent' : 'Mozilla/5.0'}
    post = session.post(login_url, data=payload)
    request = session.get(example_url)
    soup = BeautifulSoup(request.content, 'html.parser')
    box = soup.find('div', {'id' : 'container'}).find('div', {'class' : 'middle'}).find('div', {'class', 'right'}).find('div', {'class' : 'box'})
    content = box.find('p', {'class' : 'box_text'}).find_next_sibling()
    print(content)

1 Ответ

0 голосов
/ 04 сентября 2018

извлечение из bs4

Другой альтернативой является синтаксический анализатор чистого Python html5lib, который анализирует HTML, как это делает веб-браузер. В зависимости от настроек вы можете установить html5lib с помощью одной из следующих команд:

$ apt-get install python-html5lib

$ easy_install html5lib

$ pip install html5lib

С учетом сказанного вам необходимо все еще использовать форму множественного числа find_next_siblings()

Также вам потребуется параметр для вашей функции find_next_siblings().

пример:

get_html = 'https://archiwum.polityka.pl/art/sciganiewnbsp;organach,378798.html'
soup = bs4(get_html, 'html5lib')
find_location = soup.find('div', {'id' : 'container'}) \
                    .find('div', {'class' : 'middle'}) \
                    .find('div', {'class', 'right'}) \
                    .find('div', {'class' : 'box'}) \
                    .find('p', {'class' : 'box_text'}) \
                    .find_next_siblings('p')

for content in find_location:
    print(content)

Просто измените 'html.parser' на 'html5lib' и find_next_siblings('p'), затем итерируйте list()

еще лучше, добавить условный оператор для удаления пустых тегов

for content in find_location:
    if content.get_text() is not '':
        print(content)

Попробуйте и дайте мне знать, если это работает.

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