Извлечь длинное значение атрибута из нескольких строк - PullRequest
1 голос
/ 18 июня 2020

Я хочу очистить текст из всплывающей подсказки веб-сайта. Его коды HTML встроены как значение атрибута oldtitle. Я попробовал оба селектора css и xpath - например, //span[@class="spanTip underLine"]/@oldtitle - но безуспешно. Это потому, что значение атрибута разбито на несколько строк? Есть ли способ сделать это с помощью селекторов?

<tr><td>
<span class="spanTip underLine" style="cursor:default;" data-hasqtip="true" oldtitle="<table class='qtipTable'>
<tbody>
<tr>
<td><span class='label'>A:</span>1</td>
<td><span class='label'>B:</span>2</td>
</tr>
<tr>
<td><span class='label'>C:</span>3</td>
<td><span class='label'>D:</span>4</td>
</tr>
<tr>
<td><span class='label'>E:</span></td>

</tr>
<tr>
<td><span class='label'>F:</span>5</td>
<td><span class='label'>G:</span>6</td>
</tr>
</tbody>
</table>" title="" aria-describedby="qtip-5">Item with Tooltip</span>
</td>
</tr>

1 Ответ

0 голосов
/ 18 июня 2020

Вот решение, использующее BeautifulSoup от Python. Чтобы получить HTML внутри параметра oldtitle=:

txt = '''<tr><td>
<span class="spanTip underLine" style="cursor:default;" data-hasqtip="true" oldtitle="<table class='qtipTable'>
<tbody>
<tr>
<td><span class='label'>A:</span>1</td>
<td><span class='label'>B:</span>2</td>
</tr>
<tr>
<td><span class='label'>C:</span>3</td>
<td><span class='label'>D:</span>4</td>
</tr>
<tr>
<td><span class='label'>E:</span></td>

</tr>
<tr>
<td><span class='label'>F:</span>5</td>
<td><span class='label'>G:</span>6</td>
</tr>
</tbody>
</table>" title="" aria-describedby="qtip-5">Item with Tooltip</span>
</td>
</tr>'''

soup = BeautifulSoup(txt, 'html.parser')

inner_soup = BeautifulSoup( soup.select_one('span.spanTip[oldtitle]')['oldtitle'], 'html.parser' )

print(inner_soup)

Печать:

<table class="qtipTable">
<tbody>
<tr>
<td><span class="label">A:</span>1</td>
<td><span class="label">B:</span>2</td>
</tr>
<tr>
<td><span class="label">C:</span>3</td>
<td><span class="label">D:</span>4</td>
</tr>
<tr>
<td><span class="label">E:</span></td>
</tr>
<tr>
<td><span class="label">F:</span>5</td>
<td><span class="label">G:</span>6</td>
</tr>
</tbody>
</table>

Затем вы можете нормально работать с inner_soup, например:

for tr in inner_soup.select('table tr'):
    print([td.get_text(strip=True) for td in tr.select('td')])

Печать:

['A:1', 'B:2']
['C:3', 'D:4']
['E:']
['F:5', 'G:6']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...