Python 如何创建一个更具活力的刮痧蜘蛛?

Python 如何创建一个更具活力的刮痧蜘蛛?,python,scrapy,Python,Scrapy,我是Python和Scrapy的新手,我正在研究一个CMS,它可以有多达16个容器,其中包含多达10个元素,我想进行刮取。有些网站没有启用全部10个元素,可能有5个。关于动态检查每个容器以检查其是否包含5到9、10个元素并能够正确调整XPath以获得正确的产出位置的循环,有哪些技巧和指导 如果我有10个项目的Scrapy脚本,出现9个项目,那么所有内容都被移到了错误的位置,这就是为什么我想为XPath合并一些条件,这5个元素也是如此 我有一些计算dl、dd和dt元素数量的代码,这样我就可以动态更

我是Python和Scrapy的新手,我正在研究一个CMS,它可以有多达16个容器,其中包含多达10个元素,我想进行刮取。有些网站没有启用全部10个元素,可能有5个。关于动态检查每个容器以检查其是否包含5到9、10个元素并能够正确调整XPath以获得正确的产出位置的循环,有哪些技巧和指导

如果我有10个项目的Scrapy脚本,出现9个项目,那么所有内容都被移到了错误的位置,这就是为什么我想为XPath合并一些条件,这5个元素也是如此

我有一些计算dl、dd和dt元素数量的代码,这样我就可以动态更新XPath,基本上

countdlnodes = len(response.xpath(xpath_for_dl))
countdtnodes = len(response.xpath(xpath_for_dt))
在解析函数中,我有:

for dl_iterator in range (1, countdlnodes+1):
                    dlgrab = '/dl' + '[' + str(dl_iterator) + ']'

                    for dt_iterator in range(1, countdtnodes+1): #checking dt in each of the dl's

                        dtgrab1 = '/dt' + '[' +str(dt_iterator) + ']' #/dt[]
                        ddgrab = '/dd' + '[' +str(dt_iterator) + ']' #/dd[]


                        grabDTxpath = titleurlxpath + '/div/div[@class= "description"]'+ dlgrab + dtgrab1 + '/text()'


                        getdesctext = titleurlxpath + '/div/div[@class= "description"]' + dlgrab + ddgrab + '/text()'


                        #checkresp = response.xpath('//dl[1]/dt[1]/text()').get()
                        checkresp = response.xpath(grabDTxpath).get()

                        if checkresp == "text1:":
                            text1_SELECTOR = getdesctext #'/dl[1]/dd[1]/text()'
                        elif checkresp == "text2:":
                            text2_SELECTOR = getdesctext
                        elif checkresp == "text3:":
                            text3_SELECTOR = getdesctext
                        elif checkresp == "text4:":
                            text4_SELECTOR = getdesctext
                        elif checkresp == "text5:":
                            text5_SELECTOR = getdesctext
                        elif checkresp == "text6:":
                            text6_SELECTOR = getdesctext
                        elif checkresp == "text7:":
                            text7_SELECTOR = getdesctext
                        elif checkresp == "text8:":
                            text8_SELECTOR = getdesctext
                        elif checkresp == "text9:":
                            text9_SELECTOR = getdesctext
                        elif checkresp == "text10":
                            text10_SELECTOR = getdesctext
一页可能是这样的

 <div class="details">
    <dl>
         <dt>Header</dt> 
             <dd>Description</dd>
         <dt></dt> 
             <dd></dd>
         <dt></dt>
             <dd></dd> 
         <dt></dt>
             <dd></dd> 
         <dt></dt> 
             <dd></dd>
    </dl>
    <dl class="name1">
         <dt></dt>
             <dd></dd>
         <dt></dt>
             <dd></dd>
         <dt></dt>
             <dd></dd> 
         <dt></dt> 
             <dd></dd>
    </dl>
    <dl class="name2">
         <dt></dt>
             <dd></dd>
    </dl>
</div>

标题
描述
第二个页面可能是这样的(在name1类中删除了一对dt和dd元素:

 <div class="details">
    <dl>
         <dt>Header</dt> 
             <dd>Description</dd>
         <dt></dt> 
             <dd></dd>
         <dt></dt>
             <dd></dd> 
         <dt></dt>
             <dd></dd> 
         <dt></dt> 
             <dd></dd>
    </dl>
    <dl class="name1">
         <dt></dt>
             <dd></dd>
         <dt></dt>
             <dd></dd> 
         <dt></dt> 
             <dd></dd>
    </dl>
    <dl class="name2">
         <dt></dt>
             <dd></dd>
    </dl>
</div>

标题
描述
第三页可能是这样的

 <div class="details">

    <dl class="name1">
         <dt></dt>
             <dd></dd>
         <dt></dt>
             <dd></dd>
         <dt></dt>
             <dd></dd> 
         <dt></dt> 
             <dd></dd>
    </dl>
    <dl class="name2">
         <dt></dt>
             <dd></dd>
    </dl>
</div>

为什么不使用
内容作为逻辑?将所有内容读入字典(使用
作为键,然后查找正确的值。为什么不使用
内容作为逻辑?将所有内容读入字典(使用
作为键,然后查找正确的值)。