Scrapy,Python,Xpath如何匹配HTML中的相应项目

0 投票
2 回答
1293 浏览
提问于 2025-04-16 13:54

我刚接触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_datelisted_value 可能是什么值?

1

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

/a//text()

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

你需要像下面这样的相对XPath表达式:

a

div[@class=\'middle\']

其次,在像(X)HTML这样的混合内容模型中,选择文本节点并不是个好主意。你应该使用合适的DOM方法或者string()函数来提取字符串值。(在最后一种情况下,你需要对每个节点都进行评估,因为隐式的节点集合会被转换成单一节点集合)

撰写回答