Извлечь элементы указанного тега c с помощью Beautiful-Soup - PullRequest
1 голос
/ 23 марта 2020

Я хочу извлечь элементы из указанного тега c. Например - на сайте их четыре. И у каждого тега есть другие родственные теги, такие как p, h3, h4, ul и так далее. Я хочу видеть элементы h2 [1], элементы h2 [2] отдельно.

Это то, что я сделал до сих пор. Я знаю, что для l oop нет никакого смысла. Я также пытался добавить текст, но не смог сделать его успешным. Затем я попытался выполнить поиск по заданной c строке, но он выдает единственный тег этой заданной c строки, но не все остальные элементы

from bs4 import BeautifulSoup
page = "https://www.us-cert.gov/ics/advisories/icsma-20-079-01"
resp = requests.get(page)
soup = BeautifulSoup(resp.content, "html5lib")
content_div=soup.find('div', {"class": "content"})
all_p= content_div.find_all('p')
all_h2=content_div.find_all('h2')
i=0
for h2 in all_h2:
  print(all_h2[i],'\n\n')
  print(all_p[i],'\n')
  i=i+1

. Также попытался использовать append

 tags = soup.find_all('div', {"class": "content"})
 container = []
 for tag in tags:
  try:
    container.append(tag.text)
    print(tag.text)
  except:
    print(tag)

Я всего лишь новичок ie в программировании. Прошу прощения за мои плохие навыки кодирования. Все, что я хочу, это увидеть все под «смягчением» вместе. Так что, если я захочу сохранить его в БД, он будет анализировать все, что связано со смягчением, в одном столбце.

1 Ответ

0 голосов
/ 23 марта 2020

Вы можете посмотреть список c тегов ["p","ul","h2","div"], используя findNext с recursive=False, чтобы остаться на верхнем уровне:

import requests
from bs4 import BeautifulSoup
import json

resp = requests.get("https://www.us-cert.gov/ics/advisories/icsma-20-079-01")
soup = BeautifulSoup(resp.content, "html.parser")

content_div = soup.find('div', {"class": "content"})

h2_list = [ i for i in content_div.find_all("h2")]
result = []
search_tags = ["p","ul","h2","div"]

def getChildren(tag): 
    text = []
    while (tag):
        tag = tag.findNext(search_tags, recursive=False)
        if (tag is None):
            break
        elif (tag.name == "div") or (tag.name == "h2"):
            break
        else:
            text.append(tag.text.strip())
    return "".join(text)

for i in h2_list:
    result.append({
        "name": i.text.strip(),
        "children": getChildren(i)
    })

print(json.dumps(result, indent=4, sort_keys=True))
...