【问题标题】:BeautifulSoup - don't crawl tag if in certain div classBeautifulSoup - 如果在某些 div 类中,请不要抓取标签
【发布时间】:2018-05-08 17:35:48
【问题描述】:

我需要从大约 2000 个没有通用页面结构的网站中抓取纯文本,并且我认为可能很难用一个脚本进行抓取。

因此,作为“第一次爬虫”,我对 BeautifulSoup 进行了几次尝试和错误。目前,我设法通过查看某些标签(

和所有标题标签)之间的内容来抓取一些纯文本:

soup.findAll(['p', re.compile('h[0-9]'), 'title'])

但是,有时我不想从某些 rss/news-feed 中获取文本。从我在页面的源代码中看到的,它被一个css div-class包围。所以我的问题是,如果文本被某个 div 类包围,我是否可以告诉上面的命令不要抓取文本。

【问题讨论】:

    标签: python html css beautifulsoup


    【解决方案1】:

    您可以将函数用作过滤器:

    `def my_filter(tag):
    return (tag.name == 'p' or re.compile('h[0-9]').match(tag.name) or tag.name== 'title') and (tag.parent['class'] != 'certain_div_class' or not tag.parent.has_attr('class')) 
    
    my_tags = soup.findAll(my_filter)`
    

    【讨论】:

    • 不幸的是,此代码由于某种原因无法正常工作。如果我复制并粘贴它,由于这部分,它根本不起作用:(tag.parent['class'] != 'certain_div_class' or not tag.parent.has_attr('class') 但是,当我删除这部分时,我没有得到我想要的输出并且我从上面的代码中得到了。我认为您的代码没有过滤掉标题标签包围的文本。那么这可能需要另一种方法吗?不确定...
    • 我错过了那个长表达式中的右括号,很抱歉。现在编辑代码。并且不要忘记将 'certain_div_class' 更改为正确的类名。
    • 支架没问题,但这是我在尝试时已经考虑到的。我还填写了所需的课程。实际的问题是不适合您的正则表达式。当我硬输入标题标签时,即“h1”,然后我会得到带有我之前输出的输出。您可能知道如何在不输入“h1”或“h2”之类的情况下以一种很好的方式使其工作......?
    • 是的,对,我们都以错误的方式使用了re。应该有re.compile('h[0-9]').match(tag.name) 而不是tag.name == re.compile(...) 我也会把^h[0-9]{1} 作为一个精确的正则表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多