【问题标题】:Python Scrapy scraping giving garbage valuesPython Scrapy 抓取提供垃圾值
【发布时间】:2017-05-01 08:15:26
【问题描述】:

我正在尝试在一个表中练习抓取该表属于 css 类“表”并且该表有很多 tr 并且每个 tr 有 3 个 td 第一个 td 用于名称第二个 td 用于地址第三个 td(如果存在)电话号码)我需要每个“tr”的姓名、地址和电话,但由于某种原因,如果将选择器设置为 'td :: text'(每个 tr 内所有 td 的文本)工作正常,但我需要姓名、地址和电话分别

所以我使用 xpath 并为名称的第一个 td 执行此操作,第二个 td 为地址,如果存在,则为电话号码的第三个 td

            NAME_SELECTOR = '//tr/td[1]/text()'
            ADDRESS_SELECTOR = '//tr/td[2]/text()'
            PHONE = '//tr/td[3]/text()'

            yield {
                'name': np.xpath(NAME_SELECTOR).extract_first(),
                'address': np.xpath(ADDRESS_SELECTOR).extract_first(),
                'phone': np.xpath(PHONE).extract_first(),
            }

但这会给出像这样的垃圾值

为什么会有这个垃圾值?它应该工作代码很简单网站也很简单(这就是我选择它进行练习的原因)

这是完整的代码

try:
    import scrapy
except ImportError:
    print "\nERROR IMPORTING THE NECESSARY LIBRARIES\n"

class NameSpider(scrapy.Spider):
    name = 'name spider'
    start_urls = ['http://www.locatefamily.com/Street-Lists/Australia/index-1.html']

    def parse(self, response):
        SET_SELECTOR = 'table.table tr'
        for np in response.css(SET_SELECTOR):

            NAME_SELECTOR = '//tr/td[1]/text()'
            ADDRESS_SELECTOR = '//tr/td[2]/text()'
            PHONE = '//tr/td[3]/text()'

            yield {
                'name': np.xpath(NAME_SELECTOR).extract_first(),
                'address': np.xpath(ADDRESS_SELECTOR).extract_first(),
                'phone': np.xpath(PHONE).extract_first(),
            }

【问题讨论】:

    标签: python css xpath web-scraping scrapy


    【解决方案1】:

    XPath 开头的/ 总是引用根文档,这就是为什么无论np 变量现在引用什么,每次迭代都会得到相同的值。您需要添加 . 以明确说明您的意思是 XPath 与当前上下文元素相关:

    for np in response.css(SET_SELECTOR):
        NAME_SELECTOR = './/tr/td[1]/text()'
        ADDRESS_SELECTOR = './/tr/td[2]/text()'
        PHONE = './/tr/td[3]/text()'
    
        yield {
            'name': np.xpath(NAME_SELECTOR).extract_first(),
            'address': np.xpath(ADDRESS_SELECTOR).extract_first(),
            'phone': np.xpath(PHONE).extract_first(),
        }
    

    【讨论】:

    • 但我不得不这样写 './/td[1]/text()' './/tr/td[1]/text()' 由于某种原因没有返回
    • 我明白了。如果tdtr 的直接子级,那么只需td[1]td[2]td[3] 即没有.// 应该这样做...
    • 另外,请注意/text() 仅返回作为当前元素的直接子元素的文本节点,但部分名称嵌套在<a> 元素中。我没有要测试的scrapy,但以下XPath 使用lxml 工作:string(td[1])。 XPath 应该返回 td[1] 内所有文本节点的串联。
    猜你喜欢
    • 2012-09-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多