Scrapy,Python,Xpath如何匹配HTML中的相应项目
我刚接触Xpath,想用它来抓取一个网站,网站的格式如下:
<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 的列表,但是我该怎么把它们匹配起来呢?(我们不能通过索引来匹配,因为格式不对称)。
谢谢。
2 个回答
0
好吧,因为这个网站没有说明在一个 div[@class='middle']
中的内容是日期还是数值,所以你需要自己写代码来判断这个。
我想日期应该有一些特定的格式,你可以通过一些分析来匹配这些格式,可能需要用到正则表达式。
你能不能更具体一点,告诉我 listed_date
和 listed_value
可能是什么值?
1
请注意,这些XPath表达式是绝对路径:
/a//text()
//div[@class=\'middle\']
你需要像下面这样的相对XPath表达式:
a
div[@class=\'middle\']
其次,在像(X)HTML这样的混合内容模型中,选择文本节点并不是个好主意。你应该使用合适的DOM方法或者string()
函数来提取字符串值。(在最后一种情况下,你需要对每个节点都进行评估,因为隐式的节点集合会被转换成单一节点集合)