仅从python中的td选择Price值

时间:2017-11-14 09:08:55

标签: python html regex python-3.x beautifulsoup

我试图从html td标签中捕获价格值,但问题是还有其他td具有相同的类名:请参见下图。 enter image description here

这是我写的代码

from  builtins import any as b_any
from urllib.parse import urlparse
from urllib.parse import urljoin
from collections import Counter
import urllib.request
import csv
import schedule
import time
import re
from bs4 import BeautifulSoup

url="http://offer.ebay.es/ws/eBayISAPI.dll?ViewBidsLogin&item=122713288532&rt=nc&_trksid=p2047675.l2564"

req = urllib.request.Request(url, headers={'User-agent': 'Mozilla/5.0'})

htmlpage = urllib.request.urlopen(req)

html = htmlpage.read().decode('utf-8')

soup = BeautifulSoup(html,"html.parser")

table = soup.find_all('td',{'class':'onheadNav'})

'''for txt in table:
    nametxt = txt.text
    result = ''.join([i for i in nametxt if not i.isdigit()])
    cleantxt = result.replace('(','')
    print(cleantxt.replace(')',''))

    rank = txt.a.text
    print(rank)'''
price = soup.select('td.contentValueFont')
for pr in price:
    print(pr.text)

如果我将价格换成for循环,那么它只会获得第一个价格,但我想立刻获得所有价格。

编辑说明: 我想要捕获所有价格,但问题是有三个相同类名的td,一个td是Cantidad(数量)的价格一,而日期这些都有相同的类。当我试图只得到价格部分时,我的代码返回所有三个td' s。我希望你现在能得到它

3 个答案:

答案 0 :(得分:1)

懒惰的方式:

body  {
    background-image: url("https://i.imgur.com/QdMWFHZ.jpg")
}

答案 1 :(得分:1)

你需要做的就是找到所有的' tr'您想要抓取的表格中的标签,然后迭代所有这些标签以获取特定' td'。

的文字。

这样的事情:

table = soup.find_all('table')
for tr in table[9].find_all('tr')[1:-1]:
    price = tr.find_all('td')[2].text.strip()
    print(price)

经过一些研究,我们可以发现我们想要的表是页面上的第10个表,因此table[9]。此外,因为我们不想要第一个和最后一个' tr'我们做find_all('tr')[1:-1]

希望这能解决你的问题。

答案 2 :(得分:0)

简短解决方案:

from bs4 import BeautifulSoup
import requests

url = "http://offer.ebay.es/ws/eBayISAPI.dll?ViewBidsLogin&item=122713288532&rt=nc&_trksid=p2047675.l2564"
html = requests.get(url).content
soup = BeautifulSoup(html, "html.parser")

prices =[ price.string.replace('\xa0', ' ')
          for price in soup.select('td.contentValueFont') if price.string.endswith('EUR')]
print(prices)

输出:

['4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '8,90 EUR', '8,90 EUR', '8,90 EUR', '8,90 EUR', '8,90 EUR', '8,90 EUR', '8,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR', '14,90 EUR', '4,90 EUR', '4,90 EUR', '4,90 EUR']