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

How to extract data from tags which are child of another tag through scrapy and python?

这是我要从中提取数据的 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中parse函数的代码

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(),
    }

即使您没有提供与手头问题有关的太多细节,例如您得到的输出或网站和问题,我愿意花钱说问题出在 Rangers 上你输入了你的物品清单...

您所说的 return 值是 random/incorrect 来自 运行ning spider... 就像您抓取不同...研究所的网站整个目录一样?这意味着 html 片段只是您废弃的许多其他页面之一??如果是这样...

那么您的问题肯定是范围问题...您使用的范围是 select 来自同一节点中其他人的标签...但是如果站点中的页面不是全部相同的?范围保持不变,但内容的位置不同,因此您将获得 none 个值。

在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 循环中的值...

Written with StackEdit.


更新答案


正如我所怀疑的那样,我检查了该网站,当然...并不是所有关于机构简介的个人页面都会有所有相同的信息,因为它们的结构会略有不同,但一个节点关闭足以使您的数据成为垃圾。

非常细微的差别...仅此而已

这是因为 opf 使用 xpath 是彻头彻尾的关键,如果你不熟悉......基本上你可以使用特殊语法来 furthurpin-target 你的数据没有任何 if,ands 或 buts(如果你做对了就是...)

它作为结构化数据的正则表达式,例如 html、xml、markdown 等...您可以使用 .. 参数?例如包含...所以我想进一步说明路径中的 WHICH link(当然是 href 的“a”标签),我将使用“Next”一词 ...

//html/body/..../a[contains(., "next")]/@href

你可以直接使用

//a[contains(., "next")]/@href

但是您可以越具体地说明您的内容或节点的路径,您就越不可能 运行 陷入任何混乱..相反,您的解析。

在你的情况下......这样做。确切地说,虽然我不会带走所有的乐趣,但这是为了学习一些新东西,哈哈……这是一个应该是什么样子的……

response.xpath("//ul@class='clg-info'/li[包含(.,'Ownership')]/span/text().extract()

你不需要在 scrapy shell 中检查它输出的内容,如果你使用任何浏览器开发工具然后在里面执行 ctrl+f 或搜索...它应该允许 xpath 但是的......输出是“私人”......因为我基本上在'clg-info'的path/node-level中声明我正在寻找即将到来的包含纯文本词所有权的li.. . doenst 也必须是完整的单词,但是是的......然后不得不在 span 上移动......你只需要在做它的时候看看 html 就很明显了。

... 专业提示... 我之前给出的关于查找 link ... /a 标签的示例,其中包含 wordnext...你能想到这有什么用吗?? =) 在网页中导航可能会很痛苦,但知道你的 xpath 和正则表达式,没有你无法解析的内容......射击......一旦你做好了,你就可以开始真正理解如何在网页中去混淆 js 了。用手...其中一个娘娘腔 jnice studfflol