Scrapy:从元标记中提取值

3

我正在构建一个网络爬虫,因为某种原因,我需要在元标记中提取物品的ID号码,如下所示:

<meta content="1001662613">

引号中的数字是我想要的数字。

我尝试使用xpath来

Id = title.select('//meta [@content]').extract()

但是对于此类结果,查询的结果为空。使用:
Id = title.select('//meta/@content').extract()

请在meta标签后将整个页面的源代码给我...

有没有办法从标签本身中提取数字,而不是尝试进入空标签?

以供参考,这是页面源代码中包含ID号码的部分示例。

<link rel="stylesheet" type="text/css" href="/ccss/2076d1c6bea75c5b6f4c753b3b4920b6_14bfe2d5b91d791bc05282634acdfb68.css" />
<script type="text/javascript" src="/cjs/986570aebf4e6cef6e0a52faa9c5a8a2_f4ceae6565fa007f39ee4e0abe02ab7b.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>
<script type="text/javascript" src="/cjs/a373b58f85b5e68c60f3edc35b348e14_a2abaa7837c3e1ccda94d6fe6b0f7a8f.js"></script>
<meta content="1001657519"/>
<link href="http://www.groupon.com.uy/descuentos/montevideo/sushi-go-26-12-7" rel="canonical" />
<link href="http://www.groupon.com.uy/deals/feed.rss" type="application/rss+xml" rel="alternate" title="Groupon - Descuentos" />
<meta name="title" content="Desde $264 en vez de $462 por 24, 48 o 72 piezas de sushi en Sushi Go"/>

你可以尝试一下/html/head/meta/@content吗? - alecxe
与使用//meta/@content相同。它会给我大约6行的结果,而不仅仅是我要找的数字。 - ConnorU
1个回答

2

//meta/@content会返回多个结果,因为页面上有多个meta标签。只需过滤包含数字的那一个:

ids = title.select('//meta/@content').extract()
print [id for id in ids if id.isdigit()]

希望这能有所帮助。

这个可以工作,但它捕获了不止一个数字,而且它给出的第一个数字不是我需要的。有没有办法告诉它获取第二个或第n个“下一个”ID?我不熟悉Python中的迭代器,抱歉... - ConnorU
@ConnorU 当然,我已经编辑了答案。它应该使用列表推导式打印它们两个。只需取您需要的那个即可。 - alecxe
我发现我只需要将for和if的顺序调换一下就可以了。元内容标签中只有两个数字,所以我只需要使用for id in ids: if id.isdigit():Id=id这段代码。虽然这不是最好或最优雅的方法,但它能够正常工作,并且只会多运行一个赋值调用,因此效率影响很小。谢谢! - ConnorU
@ConnorU 很高兴听到这个。顺便说一下,如果这些meta标签之间有任何差异 - 你可以利用这些差异来区分它们:比如其中一个可能有一些另一个没有的属性,或者它们可能位于不同的“容器”中。。 - alecxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接