Python: доступ к новому <tr>, находясь внутри другого <tr>с BeautifulSoup4 - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь собрать некоторые данные, просматривая локальный файл HTML с помощью BeautifulSoup4. Проблема в том, что информация, которую я пытаюсь получить, находится в разных строках с одинаковыми тегами классов. Я не уверен, как получить к ним доступ. Следующий снимок экрана html содержит две строки, к которым я обращаюсь с данными, которые мне нужны, выделенными (конфиденциальная информация зарисована). enter image description here

Код, который у меня сейчас есть:

def find_data(fileName):
    with open(fileName) as html_file:
         soup = bs(html_file, "lxml")
    hline1 = soup.find("td", class_="headerTableEntry")
    hline2 = hline1.find_next_sibling("td")
    hline3 = hline2.find_next_sibling("td")
    hline4 = hline3.find_next_sibling("td", class_="headerTableEntry")

    line1 = hline1.text
    line2 = hline2.text
    line3 = hline3.text
    #Nothing yet for lines 4,5,6

Первые 3 строки отлично работают и дают 13, 39 и 33,3%, как должны. Но для строки 4 (которая должна быть вторым тегом и первым тегом с class = headerTableEntry) я получаю сообщение об ошибке «Объект NoneType не может быть вызван».

Мой вопрос: есть ли другой способ go, чтобы я мог получить доступ ко всем 6 ячейкам данных, или есть способ отредактировать, как я написал строку 4, чтобы работать? Спасибо за помощь, мы очень ценим это!

1 Ответ

1 голос
/ 19 июня 2020

Тег <tr> не находится внутри другого тега <tr>, поскольку вы можете видеть, что первый тег <tr> закрыт с помощью </tr>, так что следующий <td> не является братом предыдущего, поэтому он возвращает Никто. Он находится в следующем теге <tr>.

Pandas - отличный пакет для синтаксического анализа тегов html <table> (что это и есть). На самом деле он использует beautifulsoup под капотом. Просто получите полную таблицу и нарежьте ее по нужным столбцам:

html_file = '''<table>
<tr>
<td class="headerName">File:</td>
<td class="HeaderValue">Some Value</td>
<td></td>
<td class="headerName">Lines:</td>
<td class="headerTableEntry">13</td>
<td class="headerTableEntry">39</td>
<td class="headerTableEntry" style="back-ground-color:LightPink">33.3 %</td>
</tr>
<tr>
<td class="headerName">Date:</td>
<td class="HeaderValue">2020-06-18 11:15:19</td>
<td></td>
<td class="headerName">Branches:</td>
<td class="headerTableEntry">10</td>
<td class="headerTableEntry">12</td>
<td class="headerTableEntry" style="back-ground-color:#FFFF55">83.3 %</td>
</tr>
</table>'''



import pandas as pd

df = pd.read_html(html_file)[0]
df = df.iloc[:,3:]

Итак, для вашего кода:

def find_data(fileName):
    with open(fileName) as html_file:
        df = pd.read_html(html_file)[0].iloc[:,3:]
        print (df)

Вывод:

print (df)
           3   4   5       6
0     Lines:  13  39  33.3 %
1  Branches:  10  12  83.3 %
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...