Отдельные элементы от BeautifulSoup Resultset - PullRequest
0 голосов
/ 18 июня 2019

Я работаю над проектом, использующим Python (3.7) и BeautifulSoup (4), в котором мне нужно удалить некоторые данные, не зная точной структуры HTML, но предполагая, что соответствующая информация пользователя будет в headings, paragraph, pre and code теги. После find_all для этих тегов я хочу отделить теги headings and paragraph от тегов code and pre от объекта ResultSet.

Вот что я пробовал:

required_tags = ["h1", "h2", "h3", "h4", "h5", "pre", "code", "p"]
text_outputs = []
code_outputs = []
pages = [
        "https://bugs.launchpad.net/bugs/1803780",
        "https://bugs.launchpad.net/bugs/1780224",
        "https://docs.openstack.org/keystone/pike/_modules/keystone/assignment/core.html",
        "https://openstack-news.blogspot.com/2018/11/bug-1803780-confusing-circular.html",
        "https://www.suse.com/documentation/suse-openstack-cloud-9/doc-cloud-upstream-user/user"
        "/html/keystone/_modules/keystone/assignment/core.html"
    ]


page = requests.get(pages[0])
    html_text = BeautifulSoup(page.text, 'html.parser')
    text = html_text.find_all(required_tags)
    elements = []
    for e in html_text:
        elements.append(e.parent)
    for t in text:
        for e in elements:
            if e == 'code' or e == 'pre':
                print(e)
                code_outputs.append(t.get_text())
            else:
                text_outputs.append(t.get_text())

Но ничего не возвращает в code_outputs и text_outputs.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 18 июня 2019

Вы не получаете никаких данных, потому что вы повторяете дополнительный внутренний цикл for, который не требуется

 for e in elements:
     if e == 'code' or e == 'pre': 

См. Условие выше, вы перебираете родительский тег внутри списка дочерних тегов цикла, а также сравниваете tag object with the string.вы уже получаете данные предварительного тега в text объекте списка.

for page in pages:
    res = requests.get(page)
    html_text = BeautifulSoup(res.text, 'html.parser')
    text = html_text.find_all(required_tags)   
    for t in text:
        if t.name == 'code' or t.name == 'pre':
            print("===if===")
            code_outputs.append(t.get_text())
        else:
            print("===else===")
            text_outputs.append(t.get_text())

print(code_outputs)
print(text_outputs)

Обновление:

json_data = []
for page in pages:
    res = requests.get(page)
    html_text = BeautifulSoup(res.text, 'html.parser')
    text = html_text.find_all(required_tags)
    for t in text:
        if t.name == 'code' or t.name == 'pre':
            code_outputs.append(t.get_text())
        else:
            text_outputs.append(t.get_text())

    data = {page:{"html":text,"code_outputs":code_outputs,"text_outputs":text_outputs}}
    json_data.append(data)

print(json_data)
0 голосов
/ 18 июня 2019

Вы можете попробовать это:

from bs4 import BeautifulSoup

required_tags = ["h1", "h2", "h3", "h4", "h5", "pre", "code", "p"]
text_outputs = []
code_outputs = []
pages = [
        "https://bugs.launchpad.net/bugs/1803780",
        "https://bugs.launchpad.net/bugs/1780224",
        "https://docs.openstack.org/keystone/pike/_modules/keystone/assignment/core.html",
        "https://openstack-news.blogspot.com/2018/11/bug-1803780-confusing-circular.html",
        "https://www.suse.com/documentation/suse-openstack-cloud-9/doc-cloud-upstream-user/user"
        "/html/keystone/_modules/keystone/assignment/core.html"
    ]


page = requests.get(pages[2], verify=False)


html_text = BeautifulSoup(page.text, 'html.parser')
elements = {}


for tag in required_tags:
    data=list(html_text.find_all(tag))
    data = [dat.text for dat in data]
    if tag == "code" or tag=="pre":
        code_outputs+=data
    else:
        text_outputs+=data
0 голосов
/ 18 июня 2019

Просто получите родительское имя из элемента, например

t.parent.name =='code'

Вместо создания списка родительских элементов.

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