python - 网页抓取到 html 中的特定点然后停止

标签 python html web-scraping beautifulsoup

我正在抓取 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/

相关文章:

html - 允许用户在 Objective C 中创建和查看 HTML 文件?

android - 如何使用 Flutter 从网站上抓取图像?

python - 来自官方 Github 的 ScrapyJS 示例未运行

javascript - 在可点击框内创建可点击链接(<a href> 内的 ActionLink)

c# - 使用 HTML Agility Pack 结束元素?

python - 对空列表进行 for 循环实际上会花费时间/资源吗?

python - 使用点分隔字符串的动态字典值访问

python - 如何获取CNN的主要头条新闻?

python - 主循环中的 PyQt 调试

python - 我可以在 azure 应用服务中使用不同的文件结构吗?