从没有属性的特定 div 抓取,其中标签可以具有相同的名称



我正在尝试从wowhead中刮桌子。问题是 span 类对于 2 种不同类型的数据是相同的(出售:和购买:)。

跨度下的划分没有类,只有我在括号中写的刺痛。

我试过了

import requests
from bs4 import BeautifulSoup
import urllib.request
import re
import lxml
session = requests.session()
url1 = 'https://classicdb.ch/?item=4291'
response = session.get(url1)
soup = BeautifulSoup(response.text, 'lxml')
x=(soup.find('table', attrs={'class': "infobox"}))
y=x.find('td')
y=y.find('ul')
sell_silver = soup.select_one('div:contains("Sells for:") .moneysilver').text
buy_silver = y.select_one('div:contains("Buy for:") .moneysilver').text
print(sell_silver)
print(buy_silver)

但后来我只得到了第一个跨度。

我得到表格后的相关 HTML 如下所示

<div>
	Buy for:
	<span class="moneysilver">5</span>
</div>
</li>
<li>
<div>
	Sells for:
	<span class="moneysilver">1</span> <span class="moneycopper">25</span>
</div>

....

最终结果应该允许我将数据分类为

Buy_silver=5

Sell_silver=1

编辑以澄清问题并大声喊出@QHarr

BS4 4.7.1+ 您可以使用:containsBuy forSells for进行定位

import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://classicdb.ch/?item=4291')
soup = bs(r.content, 'lxml')
buy_silver, sell_silver = soup.select_one('li:contains("Buy for") .moneysilver').text , soup.select_one('li:contains("Sells for") .moneysilver').text

假设买入和卖出报价的顺序和距离始终相同,您可以尝试使用:

metal = """
<li>
<div>
Buyfor:
<span class="moneysilver">5</span>
</div>
</li>
<li>
<div>
Sells for:
<span class="moneysilver">1</span> <span class="moneycopper">25</span>
</div>
</li>
"""
from bs4 import BeautifulSoup as bs
soup = bs(metal, 'lxml')
silver=soup.find_all('div')
print("buy silver =",silver[0].find("span", class_="moneysilver").text)
print("sell silver =",silver[1].find("span", class_="moneysilver").text)

输出:

买白银 = 5

卖出白银 = 1

最新更新