当前位置: 首页 > 知识库问答 >
问题:

使用“\d”从具有Scrapy for Python 2的DIV中提取数据时出现XPath错误

萧宏峻
2023-03-14

我试图用scrapy for Python2从DIV中提取数据。我现在意识到不能在提取的div XPath中使用像\d这样的regex命令。我怎么才能解决这个问题呢?对于\d{,2},我想告诉python“嘿,这里应该有一个数值介于1-100之间的数字”,谢谢

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from craigslist_sample.items import CraigslistSampleItem
import re

class MySpider(CrawlSpider):
    name = "craigs" #add the 's' to make functional = "craigs"
    allowed_domains = ["craigslist.org"]
    start_urls = ["http://philadelphia.craigslist.org/cta/"]

    rules = (Rule (SgmlLinkExtractor(allow=("index\d\d\d{,3}\.html", ),restrict_xpaths=    ('//*[@id="toc_rows"]/div[3]/div/div/span/a',))
, callback="parse_items", follow= True),
)

def parse_items(self, response):
    hxs = HtmlXPathSelector(response)
    titles = hxs.select('//span[@class="pl"] | //span[@class="12"]')
    items = []

    for titles in titles:
        item = CraigslistSampleItem()
        item ["price"] = titles.select('//*[@id="toc_rows"]/div[2]/p[position() <=100])/span[3]/span[1]/text()').extract()
        item ["date"] = titles.select('//*[@id="toc_rows"]/div[2]/p[position() <=100]]/span[2]/span/text()').extract()
        item ["title"] = titles.select("a/text()").extract()
        item ["link"] = titles.select("a/@href").extract()
        items.append(item)
    return(items)

URL中的html代码片段如下:

item[“date”]=span class=“date”>1月12日/span>

item[“price”]=span class=“price”>$1950/span>

这两个都存在于此父祖先节点div id=“toc_rows”下

共有1个答案

广乐邦
2023-03-14

我假设p[\d{,2}]的意思是“前两个

元素”。

这是通过position():p[position()<=2]完成的。(提示:position()1计数。)

请注意,position()对上下文敏感地进行计数。如果您选择p元素,它会对它们进行计数,而不是对它们前面的元素数进行计数。

<div>
  <p>First paragraph</p>     <!-- div/p[1]    or div/p[position() = 1] -->
  <div>Something else</div>  <!-- div/div/[1] or div/div[position() = 1] -->
  <p>Second paragraph</p>    <!-- div/p[2]    or div/p[position() = 2] -->

  <!-- div/p[position() <= 2] will select both <p> here -->
</div>

编辑(修改问题后)。下面是我要做的:

  • 首先,选择所有行:“//div[@id='toc_row']//div[@class='row']”
  • 然后,对每一行选择...
    • 价格:“。/span[@class='price']/text()”
    • 日期:“。/span[@class='date']/text()”
    • 标题:“。/span[@class='pl']/a/text()”
    • 链接:“。/span[@class='pl']/a/@href”

 类似资料:
  • 我在从POM中提取版本号时遇到了问题。有人能帮我吗? POM. xml XPATH表达式: 错误:返回未找到匹配项

  • 你好,我需要我下面的代码的解决方案。我试图从跨度类中提取文本,但似乎所有的文本都在同一时间提取,这样我就可以一个接一个地提取文本。 JAVA代码 超文本标记语言输出 JAVA输出 独处的年龄令人惊叹的愤怒周年纪念建筑艺术态度美丽最好的生日聪明的商务车机会改变圣诞节通信计算机酷勇气爸爸约会死亡设计饮食梦想复活节教育环境平等经历失败信仰家庭著名的父亲节恐惧金融健身食物宽恕自由友谊有趣的未来园艺上帝好政

  • 这是我在调试控制台中得到的错误: 也是的,我已经应用了谷歌依赖项。 失败:生成失败,出现异常。 > 其中:Script“C:\flutter\packages\flutter_tools\gradle\flutter.gradle”行:358 错误:配置项目':cloud_firestore_web'时出现问题。 请访问https://help.gradle.org获取更多帮助 生成在3s中失败

  • 我在做迈克尔·哈特尔的教程。当我试图在我的gemset中安装rails 3.2.14时,我会遇到以下问题: $gem安装Rails-v3.2.14 错误:找不到有效的gem'rails'(=3.2.14),原因如下: 我正在使用以下内容: RVM 1.22.15 Ruby 2.0.0p247(2013-06-27修订版41674)[X86_64-Darwin12.3.0] OSX 10.8.5

  • 我得到以下错误 服务器:版本:1.12.6 API版本:1.24 Go版本:Go1.6.4 Git提交:78D1802构建:1月10日星期二20:20:01 2017 OS/arch:Linux/AMD64

  • 我如何进行映射以及什么应该是带有join fetch的查询