Scrapy xpath 给出所有匹配的元素
Scrapy xpath giving all matching elements
我有一个 HTML 文件,我想从中提取特定 DIV 下的锚 href 值。
HTML 文件看起来像这样
<html>
<head>
<title>Test page Vikrant </title>
</head>
<body>
<div class="mainContainer">
<a href="https://india.net" class="logoShape">India</a>
<nav id="vik1">
<a href="https://aarushmay.com" class="closemobilemenu">home</a>
<ul class="mainNav">
<li class="hide-submenu">
<a class="comingsoon1" href="https://aarushmay.com/fashion">Fashion </a>
</li>
</ul>
</nav>
<a href="https://maharashtra.net" class="logoShape">Maharashtra</a>
</div>
</body>
蜘蛛代码如下
import os
import scrapy
from scrapy import Selector
class QuotesSpider(scrapy.Spider):
name = "test"
localfile_folder="localfiles"
def start_requests(self):
testFile = f'{self.localfile_folder}/t1.html'
absoluteFileName = os.path.abspath(testFile)
yield scrapy.Request(url=f'file:.///{absoluteFileName}', callback=self.parse)
def parse(self, response):
hrefElements = response.xpath('//nav[@id="vik1"]').xpath('//a/@href').getall()
self.log(f'total records = {len(hrefElements)}')
我得到的输出是 4 个锚元素。而我期望它是 2。所以我使用了“选择器”并将 Div 元素存储在其中,然后尝试提取锚元素的值。效果很好。
import os
import scrapy
from scrapy import Selector
class QuotesSpider(scrapy.Spider):
name = "test"
localfile_folder="localfiles"
def start_requests(self):
testFile = f'{self.localfile_folder}/t1.html'
absoluteFileName = os.path.abspath(testFile)
yield scrapy.Request(url=f'file:.///{absoluteFileName}', callback=self.parse)
def parse(self, response):
listingDataSel = response.xpath('//nav[@id="vik1"]')
exactElement = Selector(text=listingDataSel.get())
hrefElements = exactElement.xpath('//a/@href').getall()
self.log(f'total records = {len(hrefElements)}')
我的问题是为什么我需要使用中间选择器变量来存储提取的 Div 元素?
您是否已尝试定位 class div 名称?例如,要从您的 HTML 代码中的锚元素获取文本,如下所示。
response.xpath('//div[@class = "mainContainer"]/a/text()').extract()
从那里开始,您只需定位 Href 就可以了。
查看文档here
当你这样做的时候:
exactElement = Selector(text=listingDataSel.get())
您正在创建一个选择器,其中仅包含您在 listingDataSel.get()
中提取的内容,但如下所示:
<html>
<body>
<nav id="vik1">
<a href="https://aarushmay.com" class="closemobilemenu">home
</a>
<ul class="mainNav">
<li class="hide-submenu">
<a class="comingsoon1" href="https://aarushmay.com/fashion">Fashion
</a>
</li>
</ul>
</nav>
</body>
</html>
当您使用 text
参数时,您创建了一个新的 HTML 文档,这就是您只获得两个锚元素的原因。您可以在此 link.
查看一些示例
在您的第一个代码中,您获得了 4 个锚元素,因为您正在处理原始文档。你也可以试试这个:
response.xpath('//div/nav[@id="vik1"]//a/@href').extract()
也可以得到同样的结果
我有一个 HTML 文件,我想从中提取特定 DIV 下的锚 href 值。 HTML 文件看起来像这样
<html>
<head>
<title>Test page Vikrant </title>
</head>
<body>
<div class="mainContainer">
<a href="https://india.net" class="logoShape">India</a>
<nav id="vik1">
<a href="https://aarushmay.com" class="closemobilemenu">home</a>
<ul class="mainNav">
<li class="hide-submenu">
<a class="comingsoon1" href="https://aarushmay.com/fashion">Fashion </a>
</li>
</ul>
</nav>
<a href="https://maharashtra.net" class="logoShape">Maharashtra</a>
</div>
</body>
蜘蛛代码如下
import os
import scrapy
from scrapy import Selector
class QuotesSpider(scrapy.Spider):
name = "test"
localfile_folder="localfiles"
def start_requests(self):
testFile = f'{self.localfile_folder}/t1.html'
absoluteFileName = os.path.abspath(testFile)
yield scrapy.Request(url=f'file:.///{absoluteFileName}', callback=self.parse)
def parse(self, response):
hrefElements = response.xpath('//nav[@id="vik1"]').xpath('//a/@href').getall()
self.log(f'total records = {len(hrefElements)}')
我得到的输出是 4 个锚元素。而我期望它是 2。所以我使用了“选择器”并将 Div 元素存储在其中,然后尝试提取锚元素的值。效果很好。
import os
import scrapy
from scrapy import Selector
class QuotesSpider(scrapy.Spider):
name = "test"
localfile_folder="localfiles"
def start_requests(self):
testFile = f'{self.localfile_folder}/t1.html'
absoluteFileName = os.path.abspath(testFile)
yield scrapy.Request(url=f'file:.///{absoluteFileName}', callback=self.parse)
def parse(self, response):
listingDataSel = response.xpath('//nav[@id="vik1"]')
exactElement = Selector(text=listingDataSel.get())
hrefElements = exactElement.xpath('//a/@href').getall()
self.log(f'total records = {len(hrefElements)}')
我的问题是为什么我需要使用中间选择器变量来存储提取的 Div 元素?
您是否已尝试定位 class div 名称?例如,要从您的 HTML 代码中的锚元素获取文本,如下所示。
response.xpath('//div[@class = "mainContainer"]/a/text()').extract()
从那里开始,您只需定位 Href 就可以了。
查看文档here
当你这样做的时候:
exactElement = Selector(text=listingDataSel.get())
您正在创建一个选择器,其中仅包含您在 listingDataSel.get()
中提取的内容,但如下所示:
<html>
<body>
<nav id="vik1">
<a href="https://aarushmay.com" class="closemobilemenu">home
</a>
<ul class="mainNav">
<li class="hide-submenu">
<a class="comingsoon1" href="https://aarushmay.com/fashion">Fashion
</a>
</li>
</ul>
</nav>
</body>
</html>
当您使用 text
参数时,您创建了一个新的 HTML 文档,这就是您只获得两个锚元素的原因。您可以在此 link.
在您的第一个代码中,您获得了 4 个锚元素,因为您正在处理原始文档。你也可以试试这个:
response.xpath('//div/nav[@id="vik1"]//a/@href').extract()
也可以得到同样的结果