【问题标题】:Scrapy: grabbing sibling elements of a regex matchScrapy:抓取正则表达式匹配的兄弟元素
【发布时间】:2018-06-30 06:27:27
【问题描述】:

我正在使用 Scrapy 从大学网站上抓取大学论文主题。我知道如何使用正则表达式匹配关键字,但我真正想要的信息是与匹配项相同的 div 中的其他元素。 Scrapy 中的 Response.css(...).re(...) 函数返回一个字符串。有什么方法可以导航到正则表达式匹配的父 div?

例如:https://admissions.utexas.edu/apply/freshman-admission#fndtn-freshman-admission-essay-topics。在上面的页面上,我可以使用 response.css("*::text").re("Essay Topics") 匹配论文主题 h1。但是,我想不出一种方法来获取主题 A 和主题 N 下同一 div 中的 2 个实际论文主题。

【问题讨论】:

    标签: css scrapy


    【解决方案1】:

    这不是正确的做法。你应该使用类似下面的东西

    response.xpath("//div[@id='freshman-admission-essay-topics']//h5//text()").extract()
    

    如果你只想要css,那么你可以使用

    In [7]: response.css("#freshman-admission-essay-topics h5::text, #freshman-admission-essay-topics h5 span::text").extract()
    Out[7]: ['Topic A \xa0\xa0', 'Topic N']
    

    【讨论】:

    • 感谢您的意见。我理解你的布局方式,但我希望有一种更通用的解析方法,这样我就可以使用相同的方案抓取多个站点。有没有办法做类似soup.find_all(href=re.compile("elsie")) # [example.com/elsie" id="link1">Elsie ] 在美丽的汤中,你得到标签而不是字符串匹配?
    • 它怎么能是通用的,同时提取特定的东西?
    • 假设我想在正则表达式“Essay Topics”的同一个 div 中提取所有 Li。如果 re.compile 不返回字符串而是返回 html 元素本身,我可以这样做。没有办法吗?
    • 您仍然需要使用 xpath。类似response.xpath("//li[contains(text(), 'Essay Topics')]/..//text()").extract()
    • 太棒了!非常感谢。我是否也可以在 CSS 中做到这一点,因为那是我更习惯的方式?
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 2021-06-16
    • 2012-06-02
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2020-03-17
    相关资源
    最近更新 更多