<td class="generic_td_class" data-test="specific-location">
<span class="generic-span-class">Text I want to extract</span>
</td>
我正在尝试使用Python和Beautifulsoup从几个位置提取跨度文本。我可以使用该类成功获取跨度内容,但是我需要从网页的不同区域获取多个值,并且我唯一可以搜索的方面是内部的data-test =“ specific-location” td(都是唯一的)。我将如何去做?
我已经尝试过了:
soup.find('td', data-test_="specific-location").text.strip()
但是出现以下错误:
SyntaxError: keyword can't be an expression
任何帮助将不胜感激。
答案 0 :(得分:3)
我从How to find tags with only certain attributes - BeautifulSoup那里得到了一些帮助
耦合您的代码问题。您输入了一个=,如果要测试变量是否相等,则需要使用==。
在进行数据测试后,您也有一个下划线。
但这应该可以解决问题
soup.find('td', {'data-test':"specific-location"}).text.strip()
答案 1 :(得分:2)
使用更快的CSS属性选择器,您可以传递逗号分隔的所需位置值的 list 来检索多个
from bs4 import BeautifulSoup
html = '''
<td class="generic_td_class" data-test="specific-location">
<span class="generic-span-class">Text I want to extract</span>
</td>
<td class="generic_td_class" data-test="specific-location1">
<span class="generic-span-class">Text I want to extract 2</span>
</td>
'''
soup = BeautifulSoup(html, 'lxml')
data = [item.text.strip() for item in soup.select('[data-test="specific-location"],[data-test="specific-location1"]')]
print(data)
如果这些属性出现在其他位置,请在前面添加td
data = [item.text.strip() for item in soup.select('td[data-test="specific-location"],td[data-test="specific-location1"]')]
您还可以在带有后代组合器的末尾添加一个跨度类型选择器,以指定td的子跨度,但在这里看起来过于矫kill了。
data = [item.text.strip() for item in soup.select('td[data-test="specific-location"] span,td[data-test="specific-location1"] span')]
由于@facelessuser,您还可以使用更纤薄的
td:is([data-test="specific-location"], [data-test="specific-location1"]) span