Невозможно найти таблицу, имеющую итоговый атрибут с новой строкой и пробелом, с помощью beatifulsoup 4 find () - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь проанализировать отчет AWR, чтобы получить долгосрочную информацию SQL, в этом отчете содержится более 40 таблиц, в которых все таблицы имеют один и тот же класс, но разные сводки. Что касается синтаксического анализа, BS4 на Python смог найти несколько таблиц, но одна таблица со всей информацией SQL имеет сводку с новой строкой и пробелом, как показано ниже:

HTML-тег из файла AWR:

<table border="0" class="tdiff" summary="This table displays the text of the SQL statements which have been
      referred to in the report">
<tbody><tr><th class="awrbg" scope="col">SQL Id

Я пытался использовать BS4 find(), чтобы найти эту таблицу, но она терпит неудачу каждый раз. Любая помощь будет высоко оценена.

from bs4 import BeautifulSoup as BS4    
awrFile='/XXXXXXXXXXXXXXXXXXX/test/XXXXXXXXXXDB69-1.html'
f_awr = open(awrFile, 'r')
soup  = BS4(f_awr, 'html.parser')
sqlTextInfoTable = soup.find('table', {'summary':'This table displays the text of the SQL statements which have been referred to in the report'})

print(sqlTextInfoTable) это отпечатки None.

Ответы [ 4 ]

0 голосов
/ 26 марта 2019

Используйте re для поиска определенного текста атрибута сводки.

from bs4 import BeautifulSoup
import re

data='''<table border="0" class="tdiff" summary="This table displays the text of the SQL statements which have been
      referred to in the report">
<tbody><tr><th class="awrbg" scope="col">SQL Id'''
soup=BeautifulSoup(data,'html.parser')
sqlTextInfoTable =soup.find('table', summary=re.compile('This table displays the text of the SQL statements'))
print(sqlTextInfoTable)

ИЛИ

from bs4 import BeautifulSoup
import re
data='''<table border="0" class="tdiff" summary="This table displays the text of the SQL statements which have been
      referred to in the report">
<tbody><tr><th class="awrbg" scope="col">SQL Id'''
soup=BeautifulSoup(data,'html.parser')
sqlTextInfoTable =soup.find('table', summary=re.compile('referred to in the report'))
print(sqlTextInfoTable)

Вывод:

<table border="0" class="tdiff" summary="This table displays the text of the SQL statements which have been
      referred to in the report">
<tbody><tr><th class="awrbg" scope="col">SQL Id</th></tr></tbody></table>
0 голосов
/ 26 марта 2019

Вы можете find_all() таблицы и проходить по ним, как это ...

import pandas as pd

awrFile='/XXXXXXXXXXXXXXXXXXX/test/XXXXXXXXXXDB69-1.html'
f_awr = open(awrFile, 'r')
soup  = BS4(f_awr, 'html.parser')

for table in soup.find_all('table'):
    df = pd.read_html(str(table))
    print(df) 
0 голосов
/ 26 марта 2019

Возможно, вы сможете использовать комбинацию селектора css attribute = value для совпадения подстроки. Здесь я использую ^ (начинается с оператора). Вы также можете использовать оператор * (содержит).

matches = soup.select("table[summary^='this table displays the text of the SQL statements which have been']")
0 голосов
/ 26 марта 2019

Не могли бы вы просто использовать панд и .read_html(), так как он имеет тег <table>?

html = '''<table border="0" class="tdiff" summary="This table displays the text of the SQL statements which have been
      referred to in the report">
<tbody><tr><th class="awrbg" scope="col">SQL Id'''


import pandas as pd

table = pd.read_html(html)
sqlTextInfoTable = table[0]

Так что просто сделайте:

import pandas as pd

awrFile='/XXXXXXXXXXXXXXXXXXX/test/XXXXXXXXXXDB69-1.html'
f_awr = open(awrFile, 'r')
table = pd.read_html(f_awr)
sqlTextInfoTable = table[0]

Выход:

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