如何编写只解析标签之间带有特定文本的对象的BeautifulSoup过滤器?

时间:2019-02-23 03:51:51

标签: python django python-3.x parsing beautifulsoup

我正在使用Django和Python 3.7。我想进行更有效的解析,因此我正在阅读SoupStrainer对象。我创建了一个自定义变量,以帮助我仅解析所需的元素...

def my_custom_strainer(self, elem, attrs):
    for attr in attrs:
        print("attr:" + attr + "=" + attrs[attr])
    if elem == 'div' and 'class' in attr and attrs['class'] == "score":
        return True
    elif elem == "span" and elem.text == re.compile("my text"):
        return True

article_stat_page_strainer = SoupStrainer(self.my_custom_strainer)
soup = BeautifulSoup(html, features="html.parser", parse_only=article_stat_page_strainer)

条件之一是我只想解析文本与特定模式匹配的“ span”元素。因此,

elem == "span" and elem.text == re.compile("my text")

条款。但是,这会导致

AttributeError: 'str' object has no attribute 'text'
当我尝试运行以上命令时出现

错误。写我的过滤器的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

TLDR; 不,目前在BeautifulSoup中不容易实现(需要修改BeautifulSoup和SoupStrainer对象)。

说明:

问题是通过handle_starttag()方法调用了经过Strainer的函数。您可能会猜到,开始标记中只有值(例如元素名称和属性)。

https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/init.py#L524

if (self.parse_only and len(self.tagStack) <= 1
    and (self.parse_only.text
     or not self.parse_only.search_tag(name, attrs))):
return None

并且您可以看到,如果您的Strainer函数返回False,则该元素将立即被丢弃,而没有机会考虑内部的文本(不幸的是)。

另一方面,如果您要添加“文本”进行搜索。

SoupStrainer(text="my text")

它将开始在标签内搜索文本,但这没有元素或属性的上下文-您可以看到具有讽刺意味的:/

并将其组合在一起将一无所获。而且您甚至无法像find函数中所示的那样访问parent: https://gist.github.com/RichardBronosky/4060082

因此,目前Strainers可以很好地过滤元素/属性。您需要更改许多漂亮的汤代码才能使其正常工作。

如果您确实需要这样做,建议您继承BeautifulSoup和SoupStrainer对象并修改其行为。

答案 1 :(得分:2)

似乎您尝试使用// there´s currently no valid implementation for the interface, // however we don´t care for it, we´re just interested in our own class // Thus we mock that dependency away IFan mock = new Mock<IFan>(); systemUnderTest.DoSomething(mock.Object); 方法遍历汤类元素。

为此,您可以按照以下步骤进行操作:

my_custom_strainer

然后稍微修改soup = BeautifulSoup(html, features="html.parser", parse_only=article_stat_page_strainer) my_custom_strainer(soup, attrs) 来满足以下要求:

my_custom_strainer

这样,您可以迭代访问汤对象。

答案 2 :(得分:2)

我最近为html文件创建了一个lxml / BeautifulSoup解析器,该解析器还在特定标签之间进行搜索。

我编写的函数打开了操作系统的文件管理器,并允许您选择要解析的特定html文件。

json.dumps

您可以看到我指定的标签是“ strong”,并且我试图在该标签中查找文本。

希望我能以某种方式提供帮助。