Для всех имен файлов в файле beautifulsoup возвращаемые теги пусты

#python #parsing #text #web-scraping #beautifulsoup

#python #синтаксический анализ #текст #очистка веб-страниц #beautifulsoup

Вопрос:

Я хочу проанализировать большой файл .txt и извлечь фрагменты данных на основе их родительских тегов. Проблема в том, что, например, ‘class = «ro» ‘ содержит сотни различных битов текста и чисел, большинство из которых бесполезны.

 import requests
from bs4 import BeautifulSoup

data = requests.get('https://www.sec.gov/Archives/edgar/data/320193/0000320193-18-000070.txt')

# load the data
soup = BeautifulSoup(data.text, 'html.parser')

# get the data
for tr in soup.find_all('tr', {'class':['rou','ro','re','reu']}):
    db = [td.text.strip() for td in tr.find_all('td')]
    print(db)
  

Как я уже говорил ранее, это работает для получения всех этих тегов, но 95% возвратов бесполезны. Я хочу фильтровать на основе имени файла, используя цикл for или что-то, что работает аналогично… «Для всех файлов с FILENAME = R2, R3 и т.д.»… захватите все теги с классом ‘ro’, ‘rou’ и т.д. Все, что я пробовал до сих пор, возвращает пустые значения… может кто-нибудь помочь с этим? Заранее спасибо!

 <DOCUMENT>
<TYPE>XML
<SEQUENCE>14
**<FILENAME>R2.htm** <------- for everything with this filename
<DESCRIPTION>IDEA: XBRL DOCUMENT
<TEXT>
<html>
<head>
<title></title>
.....removed for brevity
</head>
<body>
.....removed for brevity
<td class="text">amp;#160;<span></span> <------ return this tag
</td>
.....removed for brevity
</tr>
  

Два примера файлов можно найти здесь полностью:

(https://www.sec.gov/Archives/edgar/data/1800/0001104659-18-065076.txt) (https://www.sec.gov/Archives/edgar/data/1084869/0001437749-18-020205.txt)

Ответ №1:

Не уверен, как вы хотите выводить, но с bs4 4.7.1 вы можете использовать :contains псевдокласс для фильтрации тегов имени файла

 import requests
from bs4 import BeautifulSoup

data = requests.get('https://www.sec.gov/Archives/edgar/data/320193/0000320193-18-000070.txt')
soup = BeautifulSoup(data.text, 'lxml')

filenames = ['R2.htm', 'R3.htm']

for filename in filenames:
    print('-----------------------------')
    i = 1
    for item in soup.select('filename:contains("'   filename   '")'):
        print(filename, ' ', 'result'   str(i))
        for tr in item.find_all('tr', {'class':['rou','ro','re','reu']}):
            db = [td.text.strip() for td in tr.find_all('td')]
            print(db)
        i =1