如何选择复杂的课程?

时间:2014-02-28 10:52:04

标签: python xpath python-3.x lxml

请帮助解决问题。

html:

<form class="variants" action="/cart">
    <a class="thumb fancybox image_outer" href="products/apple-iphone-5s-16gb-black--space-gray-chernyj" data-fancybox-group="gallery5">
        <img src="http://first-store.ru/files/products/iphone%205S%20black_1.100x112.jpg?16ef5c4132fc88594851f92ccc2f3437" alt="Apple iPhone 5s 16GB Black &amp; Space Gray (Чёрный)" title="Apple iPhone 5s 16GB Black &amp; Space Gray (Чёрный)">
    </a>

    <h1>
        <a class="name_mark" data-product="1075" href="products/apple-iphone-5s-16gb-black--space-gray-chernyj">Apple iPhone 5s 16GB Black &amp; Space Gray (Чёрный)</a>
    </h1>

    <span class="price price_mark price_value">26 990&nbsp;<span class="currency">руб</span>

        <input id="variants_2927" name="variant" value="2927" type="radio" class="variant_radiobutton" checked="" style="display:none;">

        <input class="button buy buy_button buy_button_catalog" type="submit" value="Купить" data-result-text="Добавлено">
    </span>     
</form>

1个代码无效:

price = article.xpath('span[@class="price"]/span[@class="currency"]/text()')[0].strip()
if price:
    print(price)

2代码工作:

price = article.xpath('span/span[@class="currency"]/text()')[0].strip()
if price:
    print(price)

但我需要在模型#1上找到“价格”。问题是属性类由多个值组成。

2 个答案:

答案 0 :(得分:2)

仅当[@class="price"]属性值正好为class时,

price才会匹配。

您需要xpath类似于以下内容:

price = article.xpath('span[contains(concat(" ", normalize-space(@class), " "), " price ")]/span[@class="currency"]/text()')[0].strip()

也许您最好使用css selector

price = article.cssselect('span.price>span.currency')[0].text.strip()

答案 1 :(得分:1)

您可以像这样使用xpath(只选择价格范围):

article.xpath('span[contains(concat(" ", normalize-space(@class), " "), " price ")]')

另一种可能性是使用css选择器:

article.cssselect('span.price')