【问题标题】:Scrapy Spider not extracting xpath dataScrapy Spider 不提取 xpath 数据
【发布时间】:2016-05-09 15:23:15
【问题描述】:

我是 python 新手。我通常使用php来爬取数据。我正在尝试切换到 python。我正在按照这里的教程进行操作。

http://doc.scrapy.org/en/latest/intro/tutorial.html

我希望从此维基百科页面抓取国家和首都。 https://en.wikipedia.org/wiki/List_of_national_capitals_in_alphabetical_order

我的蜘蛛程序是:

import scrapy

class CountrySpider(scrapy.Spider):
    name = "countryCapitals"
    allowed_domains = ["wikipedia.org"]
    start_urls = [
                    "https://en.wikipedia.org/wiki/List_of_national_capitals_in_alphabetical_order"
                    ]

    def parse(self, response):
            for sel in response.xpath('//*[@id="mw-content-text"]/table[2]/tbody/tr'):
                    country = sel.xpath('//td[1]').extract()
                    capital = sel.xpath('td[2]/b/span.text()').extract()
                    print country , capital

它没有按预期打印任何数据。对此的任何帮助表示赞赏。

【问题讨论】:

  • xpath 返回的第一个打印值 - 可能是 None 或空列表
  • 它不是空的,因为我在 chrome 开发者工具中检查了它。但它没有在这里打印。这里只是“打印 sel”吧?
  • print response.xpath( ... )。 “chrome 开发者工具”不是 python。它可以显示由 javascript 创建的数据。它显示解析为树对象的数据 - 而不是 HTML 源代码。例如,即使源文件中没有 tbody,chrome 也会显示 tbody
  • tbody 中的xpath 可能是问题所在。
  • 您应该尝试使用 Scrapy 手册中的技术进行调试:doc.scrapy.org/en/latest/topics/debug.html

标签: python xpath web-scraping scrapy


【解决方案1】:

浏览器控制台中显示的 HTML 似乎与原始源代码有些不同。例如,就像@furas 指出的那样,tdoby 标签是问题的一部分。而且提取大写文本的xpath也不正确。

我用下面的 parse 方法做了一个测试,对我来说效果很好,我也更改了国家/地区 xpath 以提取国家/地区文本。

def parse(self, response):
        for sel in response.xpath('//*[@id="mw-content-text"]/table[2]/tr'):
                country = sel.xpath('td[1]/a/text()').extract()
                capital = sel.xpath('td[2]//a/text()').extract()
                print country , capital

部分输出示例:

[u'Abu Dhabi'] [u'United Arab Emirates']
[u'Abuja'] [u'Nigeria']
[u'Accra'] [u'Ghana']
[u'Adamstown'] [u'Pitcairn Islands']
[u'Addis Ababa'] [u'Ethiopia']
[u'Algiers'] [u'Algeria']
[u'Alofi'] [u'Niue']
[u'Amman'] [u'Jordan']

【讨论】:

    【解决方案2】:

    我测试了您的代码。我认为问题出在您的 xpath 上。我假设您正在使用 chrome 功能来复制 xpath。 我自己不擅长 xpath。我尝试使用 .css() 方法将值打印出来。我用过:

    print response.css('div.mw-content-ltr > table').extract()
    

    它工作正常。要获得第二个表,只需将该表的类或 id 放在上面的行中。我相信它应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      相关资源
      最近更新 更多