2011-03-17 72 views
0

我是新来的Xpath,试图scrapy网站下面的格式:Scrapy,蟒蛇,Xpath的如何匹配相应项目在HTML

<div class="top"> 
    <a> tittle_name </a> 
    <div class="middle"> listed_date </div> 
    <div class="middle"> listed_value </div> 
</div> 
<div class="top"> 
    <a> tittle_name </a> 
    <div class="middle"> listed_date </div> 
</div> 
<div class="top"> 
    <a> tittle_name </a> 
    <div class="middle"> listed_value </div> 
</div> 

listed_value & listed_date的派驻都是可选的。

我需要将每个tittle_name与各自的listed_date,listed_value(如果可用)进行分组,然后向MySQL插入到达记录。

我使用scrapy shell这给像

listings = hxs.select('//div[@class=\'top\']') 
for listing in listings: 
    tittle_name = listing.select('/a//text()').extract() 
    date_values = listing.select('//div[@class=\'middle\']') 

上面代码中一些基本的例子给我tittle_name和可用listed_date的名单,listed_value,的名单,但如何搭配他们? (由于格式不对称,我们无法按索引进行搜索)。

谢谢。

回答

0

那么,由于网站没有指定div[@class='middle']中的某个内容是日期还是值,因此您必须编码自己的方式来决定这一点。

我猜日期有一些特定的格式,你可以用一些分析来匹配,也许使用正则表达式。

您能否更具体地了解listed_datelisted_value的可能值?

+0

是的,您是对的。能够决定listed_date&listed_value。但是每个tittle_name可能具有listed_date或listed_value,可能同时具有两个或者可能没有。格式不是对称的。因此,从上面的Python代码列表中,我不知道如何在尝试插入MySQL时将tittle_name与各自的listed_date,listed_value进行匹配。也许需要不同的方法? – learnJQueryUI 2011-03-18 06:26:23

0

请注意,这些XPath表达式是绝对的:

/a//text() 

//div[@class=\'middle\'] 

你会需要相对XPath表达式这样的:

a 

div[@class=\'middle\'] 

二。在混合内容模型(如(X)HTML)中选择文本节点并不是一个好主意。您应该使用适当的DOM方法或使用string()函数来提取字符串值。 (在最后一种情况下,您需要为每个节点评估表达式,因为将隐式节点集合铸造为单独节点集合)

+0

我认为这里没有相对或绝对路径问题,因为我从列表中调用了“// div [@class = \'middle \']”,这是列表的结果= hxs.select('// div [@ class = \'最佳\']')。感谢text&string()中的注释,稍后我将在稍后改进代码时研究它。我真的不明白你最后一句话。这是一个建议,以匹配每个节点的相关条目。如果是的话,你可以更具体一些。 – learnJQueryUI 2011-03-18 06:29:25