如何使用python和beautifulsoup获取title属性?

时间:2017-03-24 17:33:55

标签: python html selenium beautifulsoup

假设如下:

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

现在,我已成功使用以下方法找到了表格和各行:

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

通过打印cells我可以看到我找到了正确的行,但我真的不确定如何获取title属性并将其另存为字符串?我试图使用temp = soup.find('td')['title'],但我在这样做时遇到了错误,所以显然我做错了。

任何建议都会非常感谢!

2 个答案:

答案 0 :(得分:2)

要获取元素的属性,可以将元素视为字典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'))

请注意,我使用了.get()方法来避免td元素失败而没有title属性。

答案 1 :(得分:2)

lxml 库通常也很有用,因为它可以使用 xpath 表达式识别HTML结构,从而可以生成更紧凑的代码。

在这种情况下,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'