Найти данные в тегах HTML с помощью Python - PullRequest
0 голосов
/ 04 января 2019

У меня есть следующий HTML-код, который я пытаюсь очистить с веб-сайта:

<td>Net Taxes Due<td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>

Я пытаюсь выполнить поиск на странице, чтобы найти текст «Чистые налоги, подлежащие уплате» внутри тега, найти братьев и сестер тега и отправить результаты в фрейм данных Pandas.

У меня есть следующий код:

soup = BeautifulSoup(url, "html.parser")
table = soup.select('#Net Taxes Due')

cells = table.find_next_siblings('td')
cells = [ele.text.strip() for ele in cells]

df = pd.DataFrame(np.array(cells))

print(df)

Я был в Интернете в поисках решения и не могу что-то придумать. Цени любую помощь.

Спасибо!

Ответы [ 5 ]

0 голосов
/ 05 января 2019

Это должно работать. Если вы используете bs4 4.7.0, вы можете использовать select. Но если вы используете более старую версию или просто предпочитаете интерфейс поиска, вы можете использовать это. Как было сказано ранее, вы не можете ссылаться на контент с #, то есть идентификатором.

import bs4

markup = """
<td>Net Taxes Due</td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>
"""

# Version 4.7.0
soup = bs4.BeautifulSoup(markup, "html.parser")
cells = soup.select('td:contains("Net Taxes Due") ~ td.value-column')
cells = [ele.text.strip() for ele in cells]
print(cells)

# Version < 4.7.0 or if you prefer find
soup = bs4.BeautifulSoup(markup, "html.parser")
cells = soup.find('td', text="Net Taxes Due").find_next_siblings('td')
cells = [ele.text.strip() for ele in cells]
print(cells)

Вы бы получили это

['$2,370.00', '$2,408.00']
['$2,370.00', '$2,408.00']
0 голосов
/ 04 января 2019

Обязательно добавьте имя тега вместе со строкой поиска. Вот как вы можете это сделать:

from bs4 import BeautifulSoup

htmldoc = """
<tr>
    <td>Net Taxes Due</td>
    <td class="value-column">$2,370.00</td>
    <td class="value-column">$2,408.00</td>
</tr>
"""    
soup = BeautifulSoup(htmldoc, "html.parser")
item = soup.find('td',text='Net Taxes Due').find_next_sibling("td")
print(item)
0 голосов
/ 04 января 2019

Предполагается, что задействована фактическая таблица HTML:

<html>
<table>
<tr>
<td>Net Taxes Due</td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>
</tr>
</table>
</html>

soup = BeautifulSoup(url, "html.parser")
table = soup.find('tr')
df = [x.text for x in table.findAll('td', {'class':'value-column'})]
0 голосов
/ 04 января 2019

В дальнейшем я ожидал использовать индексы 1 и 2, но 2 и 3, похоже, работают при использовании lxml.html и xpath

import requests
from lxml.html import fromstring
# url = ''
# tree = html.fromstring( requests.get(url).content)
h = '''
<td>Net Taxes Due<td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>

'''
tree = fromstring(h)
links = [link.text for link in tree.xpath('//td[text() = "Net Taxes Due"]/following-sibling::td[2] | //td[text() = "Net Taxes Due"]/following-sibling::td[3]' )]
print(links)
0 голосов
/ 04 января 2019

Ваш .select() звонок неверный. # в селекторе используется для сопоставления идентификатора элемента, а не его текстового содержимого, поэтому #Net означает поиск элемента с id="Net". Пробелы в селекторе означают поиск потомков, которые соответствуют каждому последующему селектору. Так что #Net Taxes Due ищет что-то вроде:

<div id="Net">
    <taxes>
        <due>...</due>
    </taxes>
</div>

Для поиска элемента, содержащего определенную строку, используйте .find() с ключевым словом string:

table = soup.find(string="Net Taxes Due")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...