如何通过scrapy和python从另一个标签的子标签中提取数据?

时间:2017-06-22 07:23:58

标签: python scrapy web-crawler scrapy-spider

这是我要从中提取数据的html代码。但每当我跑,我得到一些随机值。请有人帮我解决这个问题。

我想提取以下内容:Mumbai, Maharastra, 1958, government, UGC and Indian Institute of Technology, Bombay

HTML:

<div class="instituteInfo">
    <ul class="clg-info">
        <li>
            <a href="link here" target="_blank">Mumbai</a>,
            <a href="link here" target="_blank">Maharashtra</a>
        </li>
        <li>Estd : <span>1958</span></li>
        <li>Ownership : <span>Government</span></li>
        <li>Approved By : <span>UGC</span></li>
        <li>Affiliated To : <a href="link">Indian Institute of Technology, Bombay</a></li>
</div>

这是scrapy中的解析函数代码

def parse(self, response):
    for students in response.css('div.topBlockInstituteInfoBottom'):
    yield {
        'name': students.css('h1.titleNameCol::text').extract(),
        'city': students.css('ul.clg-info li a::text')[0].extract(),
        'state': students.css('ul.clg-info li a::text')[1].extract(),
        'estd': students.css('ul.clg-info li span::text')[0].extract(),
        'ownership': students.css('ul.clg-info li span::text')[3].extract(),
        'approved by': students.css('ul.clg-info li span::text')[4].extract(),
        'affiliation': students.css('ul.clg-info li a::text')[5].extract(),
    }

1 个答案:

答案 0 :(得分:0)

即使您没有提供与手头问题相关的详细信息,例如您输出的输出或网站和问题,我也愿意为此付出代价是你在项目中放置的游骑兵......

您说的返回值是否是随机/不正确的,当您运行蜘蛛时...就像在您的网站中抓取不同的......机构的整个目录一样?这意味着html片段只是你报废的许多其他页面之一?如果是的话......

然后你的问题肯定是一个范围问题......你的使用范围从同一节点中的其他人那里选择一个标签......但如果网站中的页面不完全相同会怎样?范围保持不变,但内容的位置不会使您获得任何值。

在for循环..

def parse(self, response):
    for students in response.css('div.topBlockInstituteInfoBottom'):

你使用的css值我无法验证它是否正确由于我不知道有问题的网站这一事实但是你显示的HTML片段...你的循环中的css值是错误的...

<div class="instituteInfo">
    <ul class="c...

再次......

for students in response.css('div.topBlockInstituteInfoBottom'):

看到我在哪里?应该使用 .instituteInfo 为循环中的css值...

  

StackEdit撰写。

更新回答

正如我所怀疑的那样,我检查了网站和网站...并非所有关于机构资料的个人网页都有相同的信息,因为它们的结构略有不同但只有一个节点关闭足以使你的数据变得垃圾。

非常微妙的差异......这就是全部需要

Canyou see the sliglt difference?

因为opf这个使用xpath的确切事情是右下角,如果你不熟悉...基本上你可以使用特殊的语法来完成任何if,ands或buts(如果你这样做)正确的是......)

它作为html,xml,markdown等结构化数据的正则表达式...你可以使用..参数?例如contains ...所以我想进一步说明路径中的WHICH链接(当然是&#34; a&#34;标记为href),其中包含单词&#34; Next&#34;我会用......

  

// html / body /..../ a [contains(。,&#34; next&#34;)] / @ href

你可以直接使用

  

// a [contains(。,&#34; next&#34;)] / @ href

但是,你可以更具体地说明你的内容或节点的路径,你遇到任何困惑的可能性就越小......相反,你的解析。

在你的情况下....这样做。确切地说,虽然我不会把所有的乐趣带走,但是我会去学习一些新的东西...继承人看起来很像......

response.xpath(&#34; // UL @class='clg-info' /锂[含有(&#39;所有权&#39)]。/量程/文本()中提取()

你不需要在scrapy shell中查看它输出的内容,如果你使用任何浏览器开发工具然后在里面做一个ctrl + f或搜索...它应该允许xpath但是是......出来put is&#34; Private&#34; ....因为我说基本上是在&#39; clg-info&#39;的路径/节点级别。我正在寻找即将到来的李,其中包含平原文字所有权... doenst必须是完整的词,但是...然后不得不在跨越那里操纵..​​.你只需要看看HTML这样做很明显。

... PRO TIP ...我之前提到的关于找到链接的示例... /一个包含wordnext的标签...你能想到它是如何有用的吗? ? =)浏览网页可能会非常痛苦,但是知道你的xpath和正则表达式,并且没有你无法解析的内容......拍摄......一旦你得到了好处,你就可以开始真正理解如何在网页中对js进行去混淆。 BY HAND ...其中一个娘娘腔的jnice studfflol