【问题标题】:How to extract the corresponding text of a Div via xpath?如何通过xpath提取Div的对应文本?
【发布时间】:2018-08-30 18:48:46
【问题描述】:

在使 xpath 从以下给定的 HTML 节点中提取数据时,我无法从 Div 中的相应元素中提取相应的文本。

<div class="Main">
    <div class="Sub">
        <div class="Birth">Jack</div>
        <span class="Date">
            <div><span class="Date">6 June 2018</span></div></span></div>
    <div class="Sub">
        <div class="Birth">Hurley</div>
        <span class="Date"><div><span class="Date">21 June 2011</span></div></span></div>
    <div class="Sub">
        <div class="Birth">Kate</div>
        <span class="Date">
            <div><span class="Date">11 May 2013</span></div></span></div>
    <div class="Sub">
        <div class="Birth">John</div>
        <span class="Date">
            <div><span class="Date">5 March 2001</span></div></span></div>

我想要的是提取 &lt;div&gt;&lt;span class="Date"&gt; 中的日期文本与 &lt;div class="Birth"&gt; 中的文本。 映射数据提取数据的问题 ['杰克','赫尔利','凯特','约翰'] 通过 xpath('//*[@class="Birth"]/text()').extract() 和 ['2018 年 6 月 6 日','2011 年 6 月 21 日','2013 年 5 月 11 日','2001 年 3 月 5 日'] 通过 xpath('//*[@class="Date"]/text()').extract() 是它们不一定要以相同的顺序排列,因此需要在 div 内进行相对映射,因为可以看出 div 类的名称对于所有段都是相同的。 可以肯定的是,对于文本元素 Kate - 日期是 2013 年 5 月 11 日。

【问题讨论】:

    标签: html xpath scrapy


    【解决方案1】:

    我不确定兄弟姐妹,但迭代方法可以解决:

    for i in range(0, len(list)):
                if list_search[i] == "Jack":
                        Updated = corresponding-value-in-div[i]
                        break
    

    【讨论】:

      【解决方案2】:

      您可以先获取&lt;div class="Sub"&gt; 的列表,对其进行迭代并使用相对xpath 来获取每个div 的元素

      这里是一个例子:

      subs = response.xpath('//div[@class="Sub"]')
      for sub in subs:
           print(sub.xpath('.//div[@class="Birth"]/text()').extract_first())
           print(sub.xpath('.//div/span[@class="Date"]/text()').extract_first())
      

      这将返回:

      杰克

      2018 年 6 月 6 日

      赫利

      2011 年 6 月 21 日

      凯特

      2013 年 5 月 11 日

      约翰 2001 年 3 月 5 日

      【讨论】:

      • 但是如果中间存在更多元素,这里的迭代会有一个缺点。例如:如果中间有一个 div class="sub",出生文本为“ben”,对应的日期为“1991 年 3 月 11 日”,但我只想要给定 Birth 类的 4 对应文本。同时产生数据并将其导出到 csv 中会产生问题。
      • 你能举一个真实的例子吗?我不确定迭代是否有问题
      • 例如:如果在 Jack div 之后还有 2 个 div 像:
        James
        2011 年 6 月 21 日
        Wane
        2011 年 6 月 21 日
        但我想要的是 Jack Hurley 的数据凯特和约翰也是如此。此外,在某些情况下,Kate div 可能会丢失,那么它必须以未找到的值返回。
      • 目前我正在做的是尝试并期望通过迭代从使用父节点提取的列表中映射数据,但是必须有一种方法可以通过 xpath 同级方法捕获它,而该方法就是我在找。
      【解决方案3】:

      请检查以下代码,而不是直接给出名称“Jack”,您也可以为其编写另一个 xpath。

      response.xpath('//div[contains(text(),"Jack")]//following-sibling::span/div//text()')
      

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签