我正在抓取 li 标签,并希望停在 html 中的特定位置。我不想要 html 中此点之后的 li 标记。
我是usnig python 3.7,beautifulsoup4,这里有一个link示例站点数据
<li class="s-item" data-view="mi:1686|iid:1">...</li>
<li class="s-item" data-view="mi:1686|iid:2">...</li>
<li class="s-item" data-view="mi:1686|iid:3">...</li>
<div class="srp-river-answer srp-river-answer--REWRITE_START" data-view="mi:1706|iid:1">...</div>
<li class="s-item" data-view="mi:1686|iid:4">...</li>
<li class="s-item" data-view="mi:1686|iid:5">...</li>
<li class="s-item" data-view="mi:1686|iid:6">...</li>
目标是获取 div 语句之前的所有 li 标记,而不获取 div 语句之后的所有 li 标记。前后的 li 标签数量因页面而异。我已经尝试过,但找不到一种方法让 beautifulsoup 抓取到 html 中的某个点。
我目前使用以下内容检索所有 li 标签
only_li = SoupStrainer('li')
soup_li = BeautifulSoup(response.text, 'lxml', parse_only = only_li)
sale_details = soup_li.find_all('li', attrs={'class':'s-item','data-view':True})
for sale in sale_details:
some scrape code
最佳答案
根据您在问题中发布的 html,您可以使用 CSS 选择器 li.s-item:not(div.srp-river-answer ~ li.s-item)
:
from bs4 import BeautifulSoup
txt = '''
<li class="s-item" data-view="mi:1686|iid:1">tag 1</li>
<li class="s-item" data-view="mi:1686|iid:2">tag 2</li>
<li class="s-item" data-view="mi:1686|iid:3">tag 3</li>
<div class="srp-river-answer srp-river-answer--REWRITE_START" data-view="mi:1706|iid:1">...</div>
<li class="s-item" data-view="mi:1686|iid:4">tag 4</li>
<li class="s-item" data-view="mi:1686|iid:5">tag 5</li>
<li class="s-item" data-view="mi:1686|iid:6">tag 6</li>
'''
soup = BeautifulSoup(txt, 'html.parser')
for li in soup.select('li.s-item:not(div.srp-river-answer ~ li.s-item)'):
print(li.text)
打印:
tag 1
tag 2
tag 3
编辑:要从您发布的链接获取数据:
import requests
from bs4 import BeautifulSoup
url = 'https://www.ebay.com/sch/i.html?_odkw=W10083957V&_sop=12&_sadis=15&_dmd=1&LH_Complete=1&LH_ItemCondition=4&LH_BIN=1&LH_Sold=1&_osacat=0&_ipg=200&_stpos=23114-3265&_from=R40&_trksid=m570.l1313&_nkw=W10083957V&_sacat=0'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
for li in soup.select('li[data-view].s-item:not(div.srp-river-answer--REWRITE_START ~ li.s-item)'):
print(li.h3.get_text(strip=True))
打印:
Maytag, Kenmore, Amana & Jenn Air Chopper Blade Assembly W10083957V - W10083957
关于python - 网页抓取到 html 中的特定点然后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62287540/