python - 使用 "\d"通过 Scrapy for Python 2 从 Div 中提取数据时出现 XPath 错误

标签 python regex xpath scrapy

我正在尝试使用 scrapy for python 2 从 div 中提取数据。我现在意识到我无法在提取的 div Xpath 中使用像\d 这样的正则表达式命令。我该如何解决这个问题?使用\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>

商品[“价格”] = span class="price">1950 美元/span>

都存在于该父祖先节点下 div id="toc_rows"

最佳答案

我假设p[\d{,2}]意思是“前两个 <p> 元素”。

这是通过 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"

关于python - 使用 "\d"通过 Scrapy for Python 2 从 Div 中提取数据时出现 XPath 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21080238/

相关文章:

javascript - 如何在 javascript 中更改图像 URL 的文本?

excel - 如何通过 Selenium VBA 向某些 HTML 元素发送文本?

python - 使用 XPath 提取序列子集

python - 将 Trie 树节点作为参数传递 - 不起作用

python - 在python中将列表中的数字相乘

javascript - 正则表达式匹配特定短语完成或不带感叹号?

javascript - 在不知道如何排除故障的情况下替换 c# 函数 bij Jquery 不工作

xml - 如何获取不同的值节点 XML

python - 我将如何用 Python 解析 'Front Matter'

python - 在Python中将递归转换为迭代