【问题标题】:scrapy xpath selector repeats datascrapy xpath 选择器重复数据
【发布时间】:2026-01-19 17:35:01
【问题描述】:

我正在尝试从每个列表中提取公司名称和地址并将其导出到 -csv,但我在输出 csv 时遇到问题。我认为 bizs = hxs.select("//div[@class='listing_content']") 可能会导致问题。

yp_spider.py

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from yp.items import Biz

class MySpider(BaseSpider):
    name = "ypages"
    allowed_domains = ["yellowpages.com"]
    start_urls = ["http://www.yellowpages.com/sanfrancisco/restaraunts"]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        bizs = hxs.select("//div[@class='listing_content']")
        items = []

        for biz in bizs:
            item = Biz()
            item['name'] = biz.select("//h3/a/text()").extract()
            item['address'] = biz.select("//span[@class='street-address']/text()").extract()
            print item
            items.append(item)

items.py

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/topics/items.html

from scrapy.item import Item, Field

class Biz(Item):
    name = Field()
    address = Field()

    def __str__(self):
        return "Website: name=%s address=%s" %  (self.get('name'), self.get('address'))

“scrapy crawl ypages -o list.csv -t csv”的输出是一长串企业名称和位置列表,并且多次重复相同的数据。

【问题讨论】:

    标签: python xpath web-scraping scrapy scrape


    【解决方案1】:

    你应该添加一个“。”选择相对xpath,这里来自scrapy文档(http://doc.scrapy.org/en/0.16/topics/selectors.html)

    一开始,你可能会想使用下面的方法,这是错误的,因为它实际上提取了所有

    来自文档的元素,不仅仅是那些内部元素:

    >>> for p in divs.select('//p') # this is wrong - gets all <p> from the whole document
    >>>     print p.extract()
    

    这是正确的做法(注意 .//p XPath 前缀的点):

    >>> for p in divs.select('.//p') # extracts all <p> inside
    >>>     print p.extract()
    

    【讨论】:

    • 效果很好。谢谢!从抓取的数据中删除 \n 字符有什么帮助吗?
    • python str提供replace()方法,可以用来删除'\n'