【问题标题】:Select sequence of next siblings in Scrapy在 Scrapy 中选择下一个兄弟姐妹的序列
【发布时间】:2017-04-27 10:42:27
【问题描述】:

我要废弃以下 html

<h2>
  <span id="title">Title</span>
</h2>
<p>Content 1</p>
<p>Content 2</p>
<p>Content 3</p>
<p>Content 4</p>
<h2>Some other header</h2>
<p>Do not want this content</p>

我要选择的是标题后面的一系列4个&lt;p&gt;标签,一遇到非&lt;p&gt;标签就忽略其他所有标签。

到目前为止,我的 xpath 是 //h2[span[@id='title']]/following-sibling::p,但这也包括不需要的

标签。

我也尝试了前面的兄弟方法,但没有运气//p[preceding-sibling::h2[span[@id='title']]]。额外的&lt;p&gt; 标签仍然包含在内。

【问题讨论】:

    标签: xpath scrapy


    【解决方案1】:

    试试这个 xpath:

    //p[preceding-sibling::h2[1][./span[@id = 'title']]]

    这个 xpath 做了什么: 它搜索 p 元素,这些元素具有 h2 元素作为前面的兄弟,但在一个条件下 - 仅当它们的第一个前面的兄弟 h2 有一个名为 span 的子元素,其属性为 id 等于 title

    为什么它过滤 &lt;p&gt;Do not want this content&lt;/p&gt; ? : 因为这个p 前面的h2s 在列出时按顺序出现:

    &lt;h2&gt;Some other header&lt;/h2&gt;

    <h2> <span id="title">Title</span> </h2>

    因此h2[1][./span[@id = 'title']] 被证明为假,因此不会返回此p

    示例 xml 上的结果:

    <root>
    <h2>
      <span id="title">Title</span>
    </h2>
    <p>Content 1</p>
    <p>Content 2</p>
    <p>Content 3</p>
    <p>Content 4</p>
    <h2>Some other header</h2>
    <p>Do not want this content</p>
    <p>Do not want this content too</p>
    </root>
    

    是:

    '<p>Content 1</p>'
    '<p>Content 2</p>'
    '<p>Content 3</p>'
    '<p>Content 4</p>'
    

    【讨论】:

      【解决方案2】:

      我建议你使用 BeautifulSoup。

      from bs4 import BeautifulSoup
      soup =  BeautifulSoup(body, 'html.parser')
      p_list = []
      for i in soup.find('span' ,{'id':'title'}).parent.next_siblings:
          if i.name=='p':
              p_list.append(i)
      print p_list
      

      【讨论】:

      • 谢谢CK。这对于更复杂的规则很有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多