scrapy 如何刮项目只有当作者不等于爱因斯坦

wmtdaxz3  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(102)

我想知道如何从http://quotes.toscrape.com/的第一页提取引用和作者,只有当作者的名字不是阿尔伯特爱因斯坦。

<div class="quote">
    <span class="text">
        "some quote"
    </span
    <span>
        "by "
        <small class="author">Albert Einstein</small>
    </span>
    <span class="text">
        "some quote"
    </span
    <span>
        "by "
        <small class="author">J.K. Rowling</small>
    </span>

我已经做了一些搜索,我能找到的最接近的东西是这些职位,但这些只是指不刮,如果属性不等于的东西,而不是如果值不等于的东西。
1 XPath for elements with attribute not equal or does not exist
2 Xpath test for ancestor attribute not equal string
3 How to use "not" in xpath?
4 Using not() in XPath
我现在有…

class AllSpider(scrapy.Spider):
    name = 'working'
    start_urls = [
        'http://quotes.toscrape.com/',
    ]

def parse(self, response):
    divs = response.xpath("//div[@class='quote']")
    for div in divs:
        l = ItemLoader(item=AllItems(), selector=div)
        l.add_xpath('title', ".//span[@class='text']/text()")
        l.add_xpath('name', ".//small[@class='author']/text()")
        yield l.load_item()

class AllItems(scrapy.Item):
    link = scrapy.Field()
    title = scrapy.Field()
    name = scrapy.Field()
    domain = scrapy.Field()

并尝试了以下方法,但它似乎没有做任何事情,我得到了与没有添加代码相同的结果。任何帮助将不胜感激!!!我能想到的唯一的其他方法是post crawl,当我可以使用pandas过滤输出的.csv文件时,但是如果有一种方法可以通过scrapy来做到这一点,我很想学习它!

def parse(self, response):
    divs = response.xpath("//div[@class='quote']")
    for div in divs:
        l = ItemLoader(item=AllItems(), selector=div)

        if l.add_xpath('name', ".//small[@class='author']/text()") != 'Albert Einstein':

            l.add_xpath('title', ".//span[@class='text']/text()")
            l.add_xpath('name', ".//small[@class='author']/text()")
            yield l.load_item()
00jrzges

00jrzges1#

所以我试了一下,我发现最好的方法是这两种方法中的一种。第一个是如果你有一个单一的值过滤掉,而第二个是如果你有一个值列表,你想过滤掉。感谢所有帮助我的人!!!

def parse(self, response):
    divs = response.xpath("//div[@class='quote']")
    for div in divs:
        l = ItemLoader(item=AllItems(), selector=div)
        name = div.xpath(".//small[@class='author']/text()").get()
        if name != 'Albert Einstein':
            l.add_xpath('title', ".//span[@class='text']/text()")
            l.add_value('name', name)
            yield l.load_item()

def parse(self, response):
    authors_to_filter = ['Albert Einstein', 'Other Name']
    divs = response.xpath("//div[@class='quote']")
    for div in divs:
        l = ItemLoader(item=AllItems(), selector=div)
        name = div.xpath(".//small[@class='author']/text()").get()
        if name not in authors_to_filter:
            l.add_value('name', name)
            yield l.load_item()
insrf1ej

insrf1ej2#

尝试复制并粘贴以下内容:

l.add_xpath('name', ".//small[@class='author'][not(contains(., 'Albert Einstein'))]/text()")

相关问题