将两个交替的XPath值匹配到一个列表中

时间:2017-06-29 16:26:28

标签: python list selenium xpath dataframe

我遇到过这个问题: 一个页面有5个div信息,其中包含子值: 的标题, 价钱, 日期

基本列表:

Titles = []
Prices = []
Dates = []

它们都具有相同的XPath Lead,因此我可以跟踪所有这些。问题是 - “价格”有时会显示,有时也不会显示在div中。

所以我得到的是:

Titles = [Title1, Title2, Title3, Title4, Title5]
Prices = [Price1, Price2, Price5] #(Missing two non-existing values of 3rd and 4th divs prices)
Dates = [Date1, Date2, Date3, Date4, Date5]

由于“价格”类并不总是存在于div中,因此它会捕获所有这些类,但是轴与正确的div属于不匹配。 (使Price5与Title3和Date3对齐)

所以当我做的时候

print(len(Titles))
print(len(Prices))
print(len(Dates))

显然它打印出来

5
3
5

它无法使用。

在这种情况下,光明的一面是每次没有“价格”类别时,不同的一类显示 - “估计”。

所以我要做的是找到“价格”和“估计”的xpath并按轴顺序将它们附加到同一个列表中,最终得到:

Titles = [Title1(1), Title2(2), Title3(3), Title4(4), Title5(5)]
Prices = [Price1(1), Price2(2), Estimation1(3), Estimation2(4), Price3(5)]
Dates = [Date1(1), Date2(2), Date3(3), Date4(4), Date5(5)]

In()是匹配正确div的(x)轴编号。

然后我将拥有我的dataFrame。

虽然我似乎找不到一种方法可以同时找到它们并按照出现顺序附加它们。

Assisstance?

编辑:按要求添加示例代码:

title = []
price = []
date = []

def grabber():

title_ = browser.find_elements_by_xpath('//*[@class="title-class"]')
for x in title_:
    try:
        title.append(x.text)
    except:
        title.append("N/A")

price_ = browser.find_elements_by_xpath('//*[@itemprop="price-class"]')
no_price = browser.find_elements_by_xpath('//*[@class="estimation-class"]')
for x, y in price_, no_price:
    price.append(x.text, "N/A")

# ^ Doesn't work of course ^, One method I tried among many other. 

date_ = browser.find_elements_by_xpath('//*[@itemprop="date-class"]')
for x in date_:
    try:
        date.append(x.text)
    except:
        date.append("N/A")

1 个答案:

答案 0 :(得分:2)

您可以通过管道(|)使用or operation ,将两个XPath合并为一个来完成此操作:

伪代码:

//div/price | //price

来自OP代码的编辑:

price_ = browser.find_elements_by_xpath('//*[@itemprop="price-class"]')
no_price = browser.find_elements_by_xpath('//*[@class="estimation-class"]')

可以组合成:

price_ = browser.find_elements_by_xpath(
    '//*[@itemprop="price-class"] | //*[@class="estimation-class"]')