2017-03-24 55 views
1

は、次のことを想定しますpythonとbeautifulsoupを使ってtitle属性を取得する方法は?

<td title="I want this title" role="gridcell"><a onclick="open" href="#">TEXT</a></td> 

さて、私が正常に使用して、それぞれのテーブルや個々の行を見つけた:cellsを印刷することにより

for rows in soup.find_all(['tr']): 
    for cells in rows.find_all(['td']): 

を私は正しい行を見つけた見ることができますが、タイトルの属性を文字列として保存する方法は本当に分かりません。私はtemp = soup.find('td')['title']を使用しようとしましたが、これを行う際にエラーが発生するので、明らかに何か間違っています。

どのような提案も大歓迎です!

答えて

1

要素の属性を取得するには、あなたが辞書(reference)として要素を扱うことができます。

soup.find('tag_name')['attribute_name'] 

そして、あなたのケースでは:私は「

for tr in soup.find_all('tr'): 
    for td in tr.find_all('td'): 
     print(td.get('title', 'No title attribute')) 

注意属性を持たないtd要素で失敗しないように、.get()メソッドを使用しました。それはよりコンパクトなコードのために作ることができますのxpath式を使用してHTMLの構造を識別することが可能となるので

+0

これは機能します。どうもありがとう! – vham

1

lxmlのライブラリは、あまりにも頻繁に便利です。

この場合、xpath式//td[@title]はすべてtd要素を要求しますが、title属性が存在することを要求します。 forループでは、すでに行われているので、属性の有無を確認する必要はありません。

>>> from io import StringIO 
>>> HTML = StringIO('''\ 
... <td title="title 1" role="gridcell"><a onclick="open" href="#">TEXT</a></td> 
... <td role="gridcell"><a onclick="open" href="#">TEXT</a></td> 
... <td title="title 2" role="gridcell"><a onclick="open" href="#">TEXT</a></td> 
... <td title="title 3" role="gridcell"><a onclick="open" href="#">TEXT</a></td>''') 
>>> parser = etree.HTMLParser() 
>>> tree = etree.parse(HTML, parser) 
>>> tds = tree.findall('//td[@title]') 
>>> tds 
[<Element td at 0x7a0888>, <Element td at 0x7a0d08>, <Element td at 0x7ae588>] 
>>> for item in tree.findall('//td[@title]'): 
...  item.attrib['title'] 
...  
'title 1' 
'title 2' 
'title 3' 
+0

こんにちはビル、私は非常にあなたのために代替方法を追加していただきありがとうございます。私も間違いなくこれを試してみるでしょう。もしあれば、学習のために。とても有難い! – vham

+0

大歓迎です! –

関連する問題