【问题标题】:Scrapy get type/info about immediate next siblingScrapy获取有关直接下一个兄弟的类型/信息
【发布时间】:2017-07-31 00:05:48
【问题描述】:

我正在从一个带有 html 的网站中提取信息,如下所示:

<h2> <span class="mw-headline" id="Cast">Cast</span></h2>
<ul><li> <a href="/Shota_Sometani" title="Shota Sometani">Shota Sometani</a> - Shinichi Izumi
</li><li> <a href="/Ai_Hashimoto" title="Ai Hashimoto">Ai Hashimoto</a> - Satomi Murano
</li><li> <a href="/Sadao_Abe" title="Sadao Abe">Sadao Abe</a> - Migi
</li><li> <a href="/Eri_Fukatsu" title="Eri Fukatsu">Eri Fukatsu</a> - Teacher Ryoko Tamiya
</li><li> <a href="/Masahiro_Higashide" title="Masahiro Higashide">Masahiro Higashide</a> - Hideo Shimada (mysterious transfer student)
</li><li> <a href="/Nao_Omori" title="Nao Omori">Nao Omori</a> - Kuramori (freelance journalist)
</li><li> <a href="/Pierre_Taki" title="Pierre Taki">Pierre Taki</a> - Miki
</li><li> <a href="/Hirofumi_Arai" title="Hirofumi Arai">Hirofumi Arai</a> - Uragami (serial killer)
</li><li> <a href="/Kazuki_Kitamura" title="Kazuki Kitamura">Kazuki Kitamura</a> - Takeshi Hirokawa (mysterious mayor candidate)
</li><li> <a href="/Tadanobu_Asano" title="Tadanobu Asano">Tadanobu Asano</a> - Goto (Takeshi Hirokawa’s bodyguard)
</li><li> <a href="/Kimiko_Yo" title="Kimiko Yo">Kimiko Yo</a> - Nobuko Izumi (Shinichi Izumi’s mother)
</li><li> <a href="/Jun_Kunimura" title="Jun Kunimura">Jun Kunimura</a> - Detective Hirama
</li><li> <a href="/Wataru_Ichinose_(1985)" title="Wataru Ichinose (1985)">Wataru Ichinose</a> - gang member
</li><li> <a href="/Roy_Kishima" title="Roy Kishima">Roy Kishima</a> - Roy Kishima
</li></ul>

另外,html 也可以如下所示:

<h2> <span class="mw-headline" id="Cast">Cast</span></h2>
<table border="0" cellspacing="3" cellpadding="0" style="text-align:center">
<tr>
<td width="100pt">
</td>
<td width="100pt">
</td>
<td width="100pt">
</td>
<td width="100pt">
</td>
<td width="100pt">
</td></tr>
<tr>
<td> <a href="/Ryosuke_Yamada" title="Ryosuke Yamada"><img alt="Assassination Classroom-Graduation-Ryosuke Yamada.jpg" src="/images/1/12/Assassination_Classroom-Graduation-Ryosuke_Yamada.jpg" width="90" height="83"/></a>
</td>
<td> <a href="/Masaki_Suda" title="Masaki Suda"><img alt="Assassination Classroom-Graduation-Masaki Suda.jpg" src="/images/4/45/Assassination_Classroom-Graduation-Masaki_Suda.jpg" width="90" height="90"/></a>
</td>
<td> <a href="/Maika_Yamamoto" title="Maika Yamamoto"><img alt="Assassination Classroom-Graduation-Maika Yamamoto.jpg" src="/images/e/e7/Assassination_Classroom-Graduation-Maika_Yamamoto.jpg" width="90" height="90"/></a>
</td>
<td> <a href="/Seika_Taketomi" title="Seika Taketomi"><img alt="Assassination Classroom-Graduation-Seika Taketomi.jpg" src="/images/c/ce/Assassination_Classroom-Graduation-Seika_Taketomi.jpg" width="90" height="90"/></a>
</td>
<td> <a href="/Mio_Yuki" title="Mio Yuki"><img alt="Assassination Classroom-Graduation-Mio Yuki.jpg" src="/images/b/b4/Assassination_Classroom-Graduation-Mio_Yuki.jpg" width="90" height="90"/></a>
</td></tr>
...
</table>

我不知道紧跟在 h2 之后作为兄弟节点的元素的类型。 在大多数情况下,h2 元素后面的元素应该是一个表格,这就是我要检查的内容。对于这个例子,我需要检测 h2 后面的元素不是表格。为此,我使用

response.xpath('//h2/span[@id="Cast"]/../following-sibling::table')

获取下表。我通常会期待一个空列表。但是,这是行不通的,因为确实有一个表格,但它还有很多元素,内容完全不相关。

有没有办法获取紧跟节点的下一个兄弟姐妹的信息?

【问题讨论】:

  • 在您的示例中,它不是表格,而是无序列表。也许这就是它不起作用的原因?
  • @nutmeg64,澄清一下。对于上面的示例,我需要一种方法来检测 h2 后面的元素不是表格。我用来获取 following-sibling::table 的命令会给我一个表格元素列表。我想过检查它是否为空以确定h2之后的元素不是表格。但是,之后有更多的表,这将行不通。
  • 您是否尝试过获取h2 的父级,从那里获取所有直系子级并仅获取第二个? (带索引 [2])
  • 感谢您的建议,但是我正在解析的 html 具有非常扁平的结构。也就是说,h2 的父级是主体,它包含所有内容。这意味着我不确定 h2 是其父元素中的第一个元素。我想我可以得到父节点,然后在它的所有子节点中搜索 h2 以找到它的索引,然后获取下一个兄弟节点?我想知道是否有更清洁的解决方案。 @nutmeg64

标签: python python-2.7 xpath web-scraping scrapy


【解决方案1】:

如果要获取紧随其后的兄弟节点的类型(名称),可以尝试

//h2/following-sibling::*[1]/name()

【讨论】:

  • 感谢您的回答!我不知道可以在跟随兄弟之后使用通配符。
【解决方案2】:

只是为了得到下一个兄弟,它会是这样的:

(//h2/span[@id="Cast"]/../following-sibling::table)[1]

【讨论】:

  • 感谢您的建议!但是,就像上面的示例一样,如果 h2 后面没有表,我可能会得到一个不是 h2 直接兄弟的表。我需要做的是查看 h2 的以下兄弟,无论其元素类型如何 - ul 或 table,并确定其类型。换句话说,我不确定紧跟在 h2 之后作为兄弟节点的元素的类型。
猜你喜欢
  • 2015-01-24
  • 1970-01-01
  • 2013-01-31
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多