如何查找和存储paritcular属性及其值?

2024-09-29 19:29:38 发布

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

让我们考虑一下

<li>this is li</li>
<li class="c1" data="this is data">ineinieni </li>
<li class="c1" >ineinieni </li>
<li data="this is the data1">ineinieni </li>
<li data="this is the data2">ineinieni </li>

这里我只想得到data属性的值,如下所示

this is data
this is data1
this is data2

因此,我尝试使用模式匹配,如下<li[^>]*?data\s*=\s*"\s*([^>]*?)\s*"[^>]*?>re.findall,但这是抛出错误

有没有什么方法可以使用漂亮的soup找到值,我尝试了下面的方法,但是抛出了类似'keyerror:data'的错误

for j in contSoup.find_all("li"):
    print j['data']            

Tags: the方法redata属性is错误li
3条回答

您可以尝试以下简单方法:

>>> html = '''<li>this is li</li>
<li class="c1" data="this is data">ineinieni </li>
<li class="c1" >ineinieni </li>
<li data="this is the data1">ineinieni </li>
<li data="this is the data2">ineinieni </li>
'''
>>> soup = BeautifulSoup(html, 'html.parser')
>>> for li in soup.find_all('li', {'data': True}):
        print(li['data'])    

this is data
this is the data1
this is the data2

或存储它:

>>> data = [x['data'] for x in soup.find_all('li', {'data': True})]
>>> data
['this is data', 'this is the data1', 'this is the data2']

您可以使用bs4对象的__getitem__方法访问数据:

import re
from bs4 import BeautifulSoup as soup
s = """
<li>this is li</li>
<li class="c1" data="this is data">ineinieni </li>
<li class="c1" >ineinieni </li>
<li data="this is the data1">ineinieni </li>
<li data="this is the data2">ineinieni </li>
"""
s = soup(s, 'lxml')
final_data = [re.sub('the\s', '', i['data']) for i in s.find_all('li') if re.findall('data\=', str(i))]

输出:

['this is data', 'this is data1', 'this is data2']

出现错误是因为某些<li>标记没有data属性,这意味着j["data"]KeyError

要避免这种情况,请使用一种可以过滤掉这些内容的方法进行搜索select是一个好方法;它允许您使用紧凑的CSS选择器语法来查找所需的元素。要仅查找具有<li>属性的data标记,请尝试:

for li in contSoup.select("li[data]"):
    print li["data"]

如Keyur所示,将data=True添加到find_all()是另一种方法

相关问题 更多 >

    热门问题