преобразовать строку в объект Beautiful Soup - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в python и пишу здесь, так что любая помощь будет очень благодарна! Я пытаюсь использовать Beautiful Soup для динамического анализа более 30 различных RSS-каналов блога. что удивительно, но они не стандартные. Итак, я начал с создания списка всех потенциальных тегов xml, которые я хочу захватить, я назвал его заголовками:

headers = ['title', 'description', 'author', 'credit', 'pubDate', 'link', 'origLink']

, затем я взял все теги из RSS-канала, который пытаюсь очистить и поместить их в свой собственный список с именем tags:

import requests
from bs4 import BeautifulSoup as bs
requests.packages.urllib3.disable_warnings()

headers = ['title', 'description', 'author', 'credit', 'pubDate', 'link', 'origLink']

url = 'https://www.zdnet.com/blog/security/rss.xml'
resp = requests.get(url, verify=False)
soup = bs(resp.text, features='xml')
data = soup.find_all('item')

tags = [tag.name for tag in data[0].find_all()]
print(tags)

, затем я создаю новый список тегов n_tags с перекрытием элементов в обоих списках:

n_tags = [i for i in headers if i in tags]
print(n_tags)

затем я перебираю все элементы данных (все сообщения в блоге на странице) и перебираю все элементы в моем списке новых тегов (все теги, относящиеся к этому блогу). Я застрял там, где n_tags - это список строк, а не объекты супа.

ручной способ синтаксического анализа фида:

for item in data:
    print(item.title.text)
    print(item.description.text)
    print(item.pubDate.text)
    print(item.credit.text)
    print(item.link.text)

Однако я хочу перебрать список теги и вставьте их в код, чтобы получить содержимое тега xml.

for item in data:
    for el in n_tags:
    content = item + "." + el + ".text"
    print(content)

это возвращает ошибку:

TypeError: unsupported operand type(s) for +: 'Tag' and 'str'

Мне нужно повернуть строку из списка в объект «Tag» супа, чтобы я мог объединить их. Я попытался преобразовать объект Tag в строку и восстановить всю строку как объект супа, но это не сработало. Ошибка не возникла, она просто вернула None

content = str(item) + "." + el + ".text"
print(soup.content)

самое близкое, что я получил:

for item in data:
    for el in n_tags:
        content = str(item) + "." + el + ".text"
        print(content)

, он действительно возвращает контент, но это не то, что я ищу , ".text", похоже, не применяется, и для каждого элемента в списке содержимое сообщения блога повторяется.

Идеи закончились, спасибо за чтение. дайте мне знать, если у вас возникнут вопросы.

1 Ответ

0 голосов
/ 05 мая 2020

Я не уверен, правильно ли я понял ваш вопрос, но похоже, что вы пытаетесь выбрать текст только из определенных c элементов внутри RSS-канала.

Вы можете попробовать этот скрипт, чтобы сделать это (используя селектор CSS):

import requests
from bs4 import BeautifulSoup as bs

url = 'https://www.zdnet.com/blog/security/rss.xml'
soup = bs(requests.get(url).content, 'html.parser')

headers = ['title', 'description', 'author', 'credit', 'pubDate', 'link', 'origLink']

for tag in soup.select(','.join(headers)):
    print(tag.text)

Печать:

ZDNet | security RSS

Tue, 05 May 2020 00:15:23 +0000

ZDNet | security RSS

US financial industry regulator warns of widespread phishing campaign
FINRA warns of phishing campaign aimed at stealing members' Microsoft Office or SharePoint passwords.
Mon, 04 May 2020 23:29:00 +0000

Academics turn PC power units into speakers to leak secrets from air-gapped systems
POWER-SUPPLaY technique uses "singing capacitor" phenomenon for data exfiltration.
Mon, 04 May 2020 16:06:00 +0000

... and so on.
...