假设如下:
<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']
,但我在这样做时遇到了错误,所以显然我做错了。
任何建议都会非常感谢!
答案 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'