网络刮xpath

时间:2017-02-25 12:27:19

标签: python web-scraping

我正在尝试学习如何从网页中提取一些数据。我使用以下代码:

import requests
from lxml import html

url = 'https://www.otomoto.pl/oferta/mercedes-benz-klasa-s-s500-long-4matik-amg-ID6yEJqd.html#003d4d5f4e'
page = requests.get(url)
tree = html.fromstring(page.content)

data1 = tree.xpath('//div[@class="offer-params__value"]/text()')
headers= tree.xpath('//span[@class="offer-params__label"]/text()')
data2 = tree.xpath('//a[@class="offer-params__link"]/text()')

有关汽车详情的网页的一部分(在图片下方),有许多细分li有汽车信息:

<li class="offer-params__item">
    <span class="offer-params__label">Rok produkcji</span>
    <div class="offer-params__value">                1985         </div>
</li>

https://www.otomoto.pl/oferta/mercedes-benz-w201-190-190-d-ID6yLUAR.html#xtor=SEC-8

有没有办法只提取一个与“Rok produkcji”标签严格关联的值(在本例中是1985年),两者都只在一个<li>内?使用我的代码我提取所有汽车详细信息的列表,我看不到直接关联,例如采取每一秒项目或类似,以确保我总是得到这个确切的事情(在这种情况下,它是制造日期)。如果此列表长度始终相同,则会没有问题,但它会发生变化。数据列表是分开的,如果它们是文本或链接则依赖。

不过,如果你能对网页抓取有一些建议,我很乐意听到。我正在尝试学习Python,我基本上是在开始。

2 个答案:

答案 0 :(得分:0)

我发现使用BeautifulSoup 4bs4

更容易实现
import bs4
import requests

url = 'https://www.otomoto.pl/oferta/mercedes-benz-w201-190-190-d-ID6yLUAR.html'
res = requests.get(url)
soup = bs4.BeautifulSoup(res.text)

# search by tag and text/content and find the next sibling
found = soup.find('span', text='Rok produkcji').find_next_sibling('div')

# get the div's content
print(found.contents[0].strip())

答案 1 :(得分:0)

这是一个纯lxml和Xpath解决方案:

import requests
from lxml import html

url = 'https://www.otomoto.pl/oferta/mercedes-benz-w201-190-2-0-d-automat-oryginalny-przebieg-dealer-ID6yEHUr.html#f5942353bf'
page = requests.get(url)
tree = html.fromstring(page.content)

data = tree.xpath("//span[text() = 'Rok produkcji']/following-sibling::div/text()")[0].strip()

print(data)