【问题标题】:Scrapy : xpath of a link in a tableScrapy : 表格中链接的 xpath
【发布时间】:2014-02-18 15:08:46
【问题描述】:

我想使用 scrapy 从这个表中提取一些书籍链接。

表格如下所示:

<table id="table_text">

<tbody>

<tr >
<td>15/02/2014</td>
<td><a href="/book_1.html">Book 1</a></td>
<td>The Author</td>
<td> <a href="/tag1">tag1</a>  <a href="/tag2">tag2</a> </td>
<td>Genre</td>
</tr>

提取的链接应该是:

/book_1.html

我使用的选择器是

def parse(self, response):
    hxs = Selector(response)
    hxs = Selector(response)
    links = hxs.xpath('//table[@id="table_text"]//tr//td[2]//a//@href')

print links 显示一个空输出:[]

我想知道我使用的xpath 有什么问题?

【问题讨论】:

  • 一个完整的复制器(也就是说,我们可以自己运行来复制的东西)会更有帮助。该页面是否公开可用?
  • 顺便说一句,您使用的//s 比您需要的要多得多。其中许多只会是单跳。
  • 您可以使用//table[@id="table_text"]//tr/td[2]/a/@href 进行简化,但根据您所描述的,XPath 可以正常工作。你能提供更多的上下文吗?更多 HTML?您是否检查了response 中的正文 is 实际上是您认为的那个(浏览器可以显示与 scrapy 检索的 HTML 不同的 HTML,例如,因为 JS)?
  • @Robin 谢谢,我检查了response.body,由于 JS,HTML 代码与 Firefox 或 Chrome 提供的不同 :-) 该表是用 new Array() 而不是 HTML 构建的。
  • 很高兴我能提供帮助,我会将评论作为答案发布以供将来参考。

标签: python xpath web-scraping scrapy scrape


【解决方案1】:

根据您提供的信息,您的 XPath 工作正常。它可以简化为

//table[@id="table_text"]//tr/td[2]/a/@href

但您的版本返回正确的节点。

当遇到scrapy 的意外行为时,请尝试始终检查它收到的HTML 是否符合您的预期。 使用浏览器检索的 HTML 和使用 scrapy 检索的 HTML 可能不同,因为 scrapy 不处理 Javascript(并且某些浏览器会尝试清理 HTML)。

这就是为什么您应该检查 response.body 的内容是否符合您的预期。如果不是,您需要找到一种解决方法:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多