strivezr
2017-08-05 05:48
采纳率: 0%
浏览 8.7k

python爬虫xpath选择多个属性

python爬虫我需要获取商品的产地,

tree.xpath(
"//div[@class='p-parameter']/ul[@class='parameter2 p-parameter-list']/li[4]/text()")
这样写是没问题的,但是如果到了下一个产品,产地就可能不是在第四个位置了,可能在第三个位置了,所以按照这个xpath写法,获取的可能就不是产地了,这要如何解决呢?而且这个title会根据商品的不同一直变化的

目前我想到的可能的解决方案:

1.我查了半天,看下xpath能否支持通配符的匹配。

tree.xpath(
"//div[@class='p-parameter']/ul[@class='parameter2 p-parameter-list']/li[@title='*省*]/text()")
以上操作不行,本意是为了让xpath查找所有的title里是否有包含‘省’的title,如果有,就提取text()文件

2.更笨的办法,把所有的省市都列举出来,用“|”符号,这样实在太麻烦了,而且我不知道到底有多少个省市

所以想问下有没有其他的解决方法?

Python

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • oyljerry 2017-08-05 07:30

    tree.xpath(
    "//div[@class='p-parameter']/ul[@class='parameter2 p-parameter-list']

    先到这一层,然后根据条件判断,再决定下一层的数据获取

    打赏 评论
  • 有数可据 2021-03-16 15:55

    xpath 是否支持你所说的*通配符,我不知道,好像不能。不过xpath是支持正则表达式的。xpath 1.0通过exslt(http://exslt.org/regexp/index.html)使用正则表达式。xpath 2.0可以直接用正则表达式。如果是简单的匹配可以用contains和starts-with函数,(很不幸,没有ends-with),他们的效率会被正则表达式高很多。

     

    如果用contains:

    //div[@class='p-parameter']/ul[@class='parameter2 p-parameter-list']/li[contains(@title, '省')]/text()

    如果用正则:

    //div[@class='p-parameter']/ul[@class='parameter2 p-parameter-list']/li[re:test(@title, '省')]/text()

    不过,使用正则不要忘记namespaces:

    tree.xpath(
    "//div[@class='p-parameter']/ul[@class='parameter2 p-parameter-list']/li[re:test(@title, '省')]/text()", namespaces={'re': 'http://exslt.org/regular-expressions'}))

     

    以上答案是根据lxml给出。

    ps: HTML里面,应该可以用css select。

    打赏 评论

相关推荐 更多相似问题