对于错误地放置在<h>标记中的<p>元素,正确的Scrapy XPath是什么?

2024-09-30 22:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设置我的第一个Scrapy Spider,使用xpath提取某些元素时遇到了一些困难。你知道吗

我的目标是http://www.cbooo.cn/m/641515(一个类似于票房魔咒的中文网站)。我可以毫无问题地提取电影的中文名称,但我不知道如何获取下面的信息。我相信这是因为HTML不是标准的,正如前面所讨论的here。标题下嵌套了几个段落元素。你知道吗

我在上面的链接中尝试了这个解决方案,也here,但没有效果。你知道吗

def parse(self, response):
    chinesetitle = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/h2/text()').extract()
    englishtitle = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/h2/p').extract()
    chinesereleasedate = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/p[4]').extract()
    productionregions = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/p[6]').extract()
    chineseboxoffice = response.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[1]/p[1]/span/text()[2]').extract()
    yield {
        'chinesetitle': chinesetitle,
        'englishtitle': englishtitle,
        'chinesereleasedate': chinesereleasedate,
        'productionregions': productionregions,
        'chineseboxoffice': chineseboxoffice
        }

当我在粘壳中运行蜘蛛时,蜘蛛会像预期的那样找到中文标题。但是,其余的项返回一个[],或者页面上的一堆奇怪的文本。你知道吗

有什么建议吗?这是我的第一个业余编程项目,所以我感谢你对我的无知和帮助的耐心。谢谢您!你知道吗

编辑

尝试在注释中实现文本清理方法。评论中的例子是有效的,但是当我试图重新实现它时,我得到了一个“Attribute Error:'list'object has no Attribute'split'”(请参阅下面的中国票房、原产国和流派示例)

def parse(self, response):
        chinesetitle = response.css('.cont h2::text').extract_first()
        englishtitle = response.css('.cont h2 + p::text').extract_first()
        chinaboxoffice = response.xpath('//span[@class="m-span"]/text()[2]').extract_first()        
        chinaboxoffice = chinaboxoffice.split('万')[0]
        chinareleasedate = response.xpath('//div[@class="ziliaofr"]/div/p[contains(text(),"上映时间")]/text()').extract_first()
        chinareleasedate = chinareleasedate.split(':')[1].split('(')[0]
        countryoforigin = response.xpath('//div[@class="ziliaofr"]/div/p')[6].xpath('text()').extract_first()
        countryoforigin = countryoforigin.split(':')[1]
        genre = response.xpath('//div[@class="ziliaofr"]/div/p[contains(text(),"类型")]/text()').extract_first()
        genre = genre.split(':')[1]
        director = response.xpath('//*[@id="tabcont1"]/dl/dd[1]/p/a/text()').extract()

Tags: textdividresponsetopextracth2xpath
2条回答

这里有一些例子,你可以从中推断出最后一个。记住总是使用class或id属性来标识html元素。/div[3]/div[2]/div/div[1]/..不是一个好的做法。你知道吗

chinesetitle = response.xpath('//div[@class="ziliaofr"]/div/h2/text()').extract_first()
englishtitle = response.xpath('//div[@class="ziliaofr"]/div/p/text()').extract_first()
chinesereleasedate = response.xpath('//div[@class="ziliaofr"]/div/p[contains(text(),"上映时间")]/text()').extract_first())
productionregions = response.xpath('//div[@class="ziliaofr"]/div/p')[6].xpath('text()').extract_first()

为了找到chinesereleasedate,我使用了文本包含'上映时间'p元素。你必须解析它才能得到准确的值。你知道吗

为了找到productionregions,我从列表中选择了第7个选择器response.xpath('//div[@class="ziliaofr"]/div/p')[6]选择了文本。一个更好的方法是检查文本是否包含如上所述的'。你知道吗

编辑:回答评论中的问题

response.xpath('//div[@class="ziliaofr"]/div/p[contains(text(),"上映时间")]/text()').extract_first()

返回一个类似'\r\n 上映时间:2017-7-27(中国)\r\n '的字符串,它不是您要查找的字符串。你可以像这样清理它:

chinesereleasedate = chinesereleasedate.split(':')[1].split('(')[0]

这给了我们正确的日期。你知道吗

您不必用xpath折磨自己,顺便说一下,您可以使用css:

response.css('.cont h2::text').extract_first()
# '战狼2'
response.css('.cont h2 + p::text').extract_first()
# 'Wolf Warriors 2'

相关问题 更多 >