使用Soup从HTML属性中提取值

2024-09-30 06:19:14 发布

您现在位置:Python中文网/ 问答频道 /正文

This is我使用的完整html

这是上述HTML的简化版本:

<table class="premium">
    <tr class="retailer top-offer" data-pricer="47.84" saler-id="123">...</td>
    <tr class="retailer" data-pricer="57.11" saler-id="234">...</td>
</table>
<table class="basic-supp">
    <tr class="retailer top-offer" data-pricer="41.87" saler-id="456">...</td>
    <tr class="retailer" data-pricer="58.12" saler-id="567">...</td>
</table>

从带有class=“basic supp”TR标记的表以及data pricer=“…”属性的表中,我需要提取值

我在简化html上尝试了此方法:

from bs4 import BeautifulSoup
with open('file.html', 'r') as f:
    contents = f.read()
soup = BeautifulSoup(contents, 'lxml')
tags = soup.find_all('tr')
for tag in tags:
    print(tag.attrs['data-pricer'])

> 47.84
> 57.11
> 41.87
> 58.12

这几乎就是我所需要的,只是它从两个表中获取值,而不是从带有class=“basic supp”的表中获取值。知道怎么修吗

主要的问题是它在我上面发布的完整html上根本不起作用。错误:

    print(tag.attrs['data-pricer'])
KeyError: 'data-pricer'

谁能给我一些建议吗

谢谢你抽出时间

顺便说一句,这甚至不是postExtracting an attribute value with beautifulsoup的复制品


Tags: iddatabasictophtmltagtabletr
2条回答

只使用css选择器更容易:

data = []
for tr in soup.select('table.basic-supp tr'):
    data.append([tr['data-pricer'],tr['saler-id'] ])
print(data)

或者,如果要使用极端列表理解,请使用一行:

[[tr['data-pricer'],tr['saler-id']] for tr in soup.select('table.basic-supp tr')]

无论哪种情况,输出都应为:

[['41.87', '456'], ['58.12', '567']]

首先找到<tr>,然后用tr['data-pricer']得到你想要的

试试这个:

from bs4 import BeautifulSoup

html = '''
<table class="premium">
    <tr class="retailer top-offer" data-pricer="47.84" saler-id="123">...</td>
    <tr class="retailer" data-pricer="57.11" saler-id="234">...</td>
</table>
<table class="basic-supp">
    <tr class="retailer top-offer" data-pricer="41.87" saler-id="456">...</td>
    <tr class="retailer" data-pricer="58.12" saler-id="567">...</td>
</table>
'''

soup = BeautifulSoup(html , 'html.parser')
for table in soup.find_all("table", {"class": "basic-supp"}):
    for tr in table.find_all('tr'):
        print(tr['data-pricer'])

相关问题 更多 >

    热门问题