2015-06-12 122 views
4

我想從BeautifulSoup獲取所有data-js屬性值。通過BeautifulSoup獲取屬性值

輸入:

<p data-js="1, 2, 3">some text..</p><p data-js="5">some 1 text</p><p data-js="4"> some 2 text. </p> 

輸出:

['1, 2, 3', '5', '4'] 

我和LXML做到了:

>>> content = """<p data-js="1, 2, 3">some text..</p><p data-js="5">some 1 text</p><p data-js="4"> some 2 text. </p>""" 
>>> import lxml.html as PARSER 
>>> root = PARSER.fromstring(content) 
>>> root.xpath("//*/@data-js") 
['1, 2, 3', '5', '4'] 

我想通過BeautifulSoup上述結果。

回答

4

這個想法是找到具有所有元素data-jsattributes並收集他們的列表:

from bs4 import BeautifulSoup 


data = """ 
<p data-js="1, 2, 3">some text..</p><p data-js="5">some 1 text</p><p data-js="4"> some 2 text. </p> 
""" 

soup = BeautifulSoup(data) 
print [elm['data-js'] for elm in soup.find_all(attrs={"data-js": True})] 

打印['1, 2, 3', '5', '4']

+0

謝謝。 upvoted,我會檢查。 –

2

您可以使用find_all()來實現此功能,但必須將屬性名稱放在字典中,因爲它本身不能用作關鍵字參數。

html = BeautifulSoup(content) 
data = html.find_all(attrs={'data-js': True}) 

有關更多說明,請參閱here

+0

謝謝。 upvoted,我會檢查。 –

4

map可能更快的方法沒有列表理解。

from bs4 import BeautifulSoup 
d = "..." 
# create a soup instance 
soup = BeautifulSoup(d) 
# find all p-elements containing an data-js attribute 
p = soup.find_all('p', attrs={"data-js": True}) 
# unpack data-js attribute from p-elements and map to new list 
print map(lambda x: x['data-js'], p) 

http://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all

+0

謝謝。 upvoted,data-js屬性將是任何標籤。 –

+0

@VivekSable我知道,'True'只是保證key'data-js'出現在'p'元素中。所以你不會遇到'KeyError:'data-js''。 – wenzul