Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy的XPATH_Python_Xpath_Scrapy - Fatal编程技术网

Python Scrapy的XPATH

Python Scrapy的XPATH,python,xpath,scrapy,Python,Xpath,Scrapy,所以我用SCRAPY从一个网站的书上刮下来 我让爬虫程序工作,它可以很好地爬行,但是当涉及到使用XPATH中的select清理HTML时,它有点不正常。现在,因为它是一个图书网站,我在每个页面上几乎有131本书,它们的XPATH是这样的 例如,获取书籍的标题- 1st Book-->/html/body/div/div[3]/div/div/div[2]/div/ul/li/a/span 第二本书-->/html/body/div/div[3]/div/div/div[2]/div/ul/li[

所以我用SCRAPY从一个网站的书上刮下来

我让爬虫程序工作,它可以很好地爬行,但是当涉及到使用XPATH中的select清理HTML时,它有点不正常。现在,因为它是一个图书网站,我在每个页面上几乎有131本书,它们的XPATH是这样的

例如,获取书籍的标题-

1st Book-->/html/body/div/div[3]/div/div/div[2]/div/ul/li/a/span
第二本书-->/html/body/div/div[3]/div/div/div[2]/div/ul/li[2]/a/span
第三本书-->/html/body/div/div[3]/div/div/div[2]/div/ul/li[3]/a/span
DIV[]的数字随着书的增加而增加。我不知道如何让它进入一个循环,以便它捕获所有的标题。我必须为图片和作者的名字也这样做,但我认为这将是类似的。只需要完成最初的一个


提前感谢您的帮助。

以下是一个解析示例html的示例:

lis = hxs.select('//div/div[3]/div/div/div[2]/div/ul/li')
for li in lis:
    book_el = li.select('a/span/text()')
通常,您可以执行类似于
//div[@class=“final price”]//span
的操作来获取一个xpath中所有跨度的列表。确切的表达式取决于你的html,这只是给你一个想法


否则,上面的代码应该会起作用。

有不同的方法来实现这一点

  • 选择多个节点的最佳方法是,根据ID或类进行选择。 e、 g:

  • 你可以这样选择

    for i in range(0, upto_num_of_divs):
        list = sel.xpath("//div[%s]" %i)
    
    for i in range(0, upto_num_of_divs):
        list = sel.xpath("//div[position > =1 and position() < upto_num_of_divs])
    
  • 你可以这样选择

    for i in range(0, upto_num_of_divs):
        list = sel.xpath("//div[%s]" %i)
    
    for i in range(0, upto_num_of_divs):
        list = sel.xpath("//div[position > =1 and position() < upto_num_of_divs])
    
    适用于范围内的i(0,最多为/u divs的/u num):
    list=sel.xpath(//div[position>=1和position()

  • li
    数字增加,而不是
    div
    数字。您确定第一个表达式末尾有
    img
    ,而不是
    span
    ?div[2]也应该是div[position()=2]。您是否可以尝试不使用绝对路径,而是通过某个id/类或任何其他属性获取标题或任何元素?问题是,我必须使用绝对路径,因为它们中的大多数都具有相同的id/类名。@Choroba,很抱歉,这是一个打字错误,即/span。例如,在获取price时,所有类都是这样的—“类”=“fksd bodytext price final price”所以如果我抓取这个类,我会得到页面上的所有内容。谢谢你的解释。我确实找到了一个chrome扩展名“XPATH VIEWER”,它只通过右键单击我想要的元素来给我XPATH。例如,它会给我这样的输出=/*[@id=“search\u results”]/div[1]/div/div[2]/h2/a/text()