【问题标题】:Web scrape up to a specific point in the html then stop网页抓取到 html 中的特定点然后停止
【发布时间】:2020-09-28 22:07:42
【问题描述】:

我正在抓取 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 标签数量因页面而异。我已经尝试过,直到 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

【问题讨论】:

  • 你现在是如何得到这部分的?可以给你的代码(至少这部分输出)?
  • 我把它添加到你的问题中
  • 您想转义 'div' 是为了提高代码效率还是仅仅为了一些错误?
  • 我只想要 li 标签在 div 之前而不是在 div 之后

标签: python html web-scraping beautifulsoup


【解决方案1】:

根据您在问题中发布的 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

【讨论】:

  • 太棒了 - 谢谢
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 2018-09-25
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多