Django 如何使用BeautifulSoup搜索在另一个元素之前出现的元素?
我将Beautifulsoup4与Python3.7一起使用。我有下面的HTMLDjango 如何使用BeautifulSoup搜索在另一个元素之前出现的元素?,django,python-3.x,beautifulsoup,Django,Python 3.x,Beautifulsoup,我将Beautifulsoup4与Python3.7一起使用。我有下面的HTML <tr> <td class="info"><div class="title">...</div></td> </tr> <tr class="ls"> <td colspan="3">Less similar results</td> </tr> <tr>
<tr>
<td class="info"><div class="title">...</div></td>
</tr>
<tr class="ls">
<td colspan="3">Less similar results</td>
</tr>
<tr>
<td class="info"><div class="title">...</div></td>
</tr>
但这将返回该类的所有div,即使是在我要筛选的元素之后出现的div。我如何改进搜索,使其只包含该particualr TD之前的结果?试试这个-
o = []
for td in soup.find("td", class_="info"):
if td.get_text() == 'Less similar results':
break
for div in td.findChildren("div", class_='title'):
o.append(div.get_text())
print(o)
我们可以换一种方式,首先关注
:
from bs4.element import Tag
ls = soup.find('tr', class_='ls')
elts = [td for tr in ls.previous_siblings
if isinstance(tr, Tag)
for td in tr.find_all('td', class_='info')]
来自bs4.element导入标记的
ls=soup.find('tr',class='ls')
elts=[td表示ls中的tr。以前的兄弟姐妹
如果isinstance(tr,标签)
对于tr中的td.find_all('td',class='info')]
这给了我们:
>>> elts
[<td class="info"><div class="title">...</div></td>]
>>elts
[...]
因此,我们首先用一个
class=“ls”
来定位tr
,然后迭代它以前的同级并查找
s。您可以使用CSS选择器tr:not(tr:has(td:contains(“不太相似的结果”)~*)div.title
:
data = '''<tr>
<td class="info"><div class="title">THIS YOU WANT ...</div></td>
</tr>
<tr class="ls">
<td colspan="3">Less similar results</td>
</tr>
<tr>
<td class="info"><div class="title">THIS YOU DON'T WANT ...</div></td>
</tr>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'lxml')
print(soup.select('tr:not(tr:has(td:contains("Less similar results")) ~ *) div.title'))
data=''
这是你想要的。。。
不太相似的结果
这是你不想要的。。。
'''
从bs4导入BeautifulSoup
soup=BeautifulSoup(数据'lxml')
打印(soup.select('tr:not(tr:has(td:contains(“不太相似的结果”))~*)div.title'))
印刷品:
[<div class="title">THIS YOU WANT ...</div>]
[这是您想要的…]
这是什么意思?
tr:not(tr:has(td:contains(“不太相似的结果”)~*)div.title
选择带有类标题的
,该标题位于
下,该标题位于
之前,其中包含
,且具有“不太相似的结果”
进一步阅读:
是否总是在
中定义“不太相似的结果”?
[<div class="title">THIS YOU WANT ...</div>]