Разбор html дочернего элемента [BeautifulSoup] - PullRequest
0 голосов
/ 10 марта 2020

У меня всего две недели обучения python.

Я отправляю на слом и XML файл и один из элементов l oop [item-> description], имею HTML внутри, как я могу получить текст внутри p?

url="https://www.milenio.com/rss"
source=requests.get(url)
soup=BeautifulSoup(source.content, features="xml")

items=soup.findAll('item')

for item in items:
  html_text=item.description
  # This returns HTML code: <p>Paragraph 1</p> <p>Paragraph 2</p>

Эта следующая строка может работать, НО я получил некоторые внутренние, внешние ссылки и изображения, которые не требуются.

desc=item.description.get_text()

Итак, если я сделаю все oop o, пытаясь получить все p, это не сработает.

for p in html_text.find_all('p'):
  print(p)

AttributeError: у объекта 'NoneType' нет атрибута 'find_all'

Спасибо большое!

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Проблема заключается в том, как bs4 обрабатывает CData (это довольно хорошо задокументировано, но не очень решено).

Вам нужно будет импортировать CData из bs4, что поможет извлечь CData в виде строки и использовать html .parser library, оттуда создайте новый объект bs4 с этой строкой, чтобы присвоить ему атрибут findAll и переберите его содержимое.

from bs4 import BeautifulSoup, CData
import requests

url="https://www.milenio.com/rss"
source=requests.get(url)
soup = BeautifulSoup(source.content, 'html.parser')

items=soup.findAll('item')

for item in items:
  html_text = item.description
  findCdata = html_text.find(text=lambda tag: isinstance(tag, CData))
  newSoup = BeautifulSoup(findCdata, 'html.parser')
  paragraphs = newSoup.findAll('p')
  for p in paragraphs:
    print(p.get_text())

Edit: OP, необходимый для извлечения текста ссылки и обнаружил, что это возможно только внутри элемента l oop с использованием link = item.link.nextSibling, потому что содержимое ссылки прыгает за пределы своего тега, как, например, </link>http://www.... В древовидном представлении XML этот конкретный XML do c показал раскрывающийся список для элемента ссылки, который, вероятно, является причиной.

Чтобы получить содержимое из других тегов внутри документа, которые не отображают в раскрывающемся списке XML в виде дерева и без вложенных CData преобразовать тег в нижний регистр и вернуть текст как обычно:

item.pubdate.get_text() # Gets contents the tag <pubDate>
item.author.get_text() # Gets contents of the tag <author>
0 голосов
/ 10 марта 2020

это должно выглядеть так:

for item in items:
    html_text=item.description #??

    #!! dont use html_text.find_all !!
    for p in item.find_all('p'):
        print(p)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...