我正在使用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'
当我尝试运行以上命令时出现错误。写我的过滤器的正确方法是什么?
答案 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”,并且我试图在该标签中查找文本。
希望我能以某种方式提供帮助。