我正在尝试使用beautifulsoup解析div
下的所有元素,问题是我在解析之前不知道div下面的所有元素。例如,div可以包含段落模式和项目符号格式的文本数据以及一些href
元素。我打开的每个网址都可以在我看到的特定div类下面有不同的元素:
示例:
url a可以有以下内容:
<div class='content'>
<p> Hello I have a link </p>
<li> I have a bullet point
<a href="foo.com">foo</a>
</div>
但是url b
可以
<div class='content'>
<p> I only have paragraph </p>
</div>
我开始做这样的事情:
content = souping_page.body.find('div', attrs={'class': 'content})
但如何超越这一点并不是一件容易的事。我希望从所有解析数据中创建一个字符串作为最终结果。
最后,我希望从每个示例中获取以下字符串:
示例1:最终输出
parse_data = Hello I have a link I have a bullet point
parse_links = foo.com
示例2:最终输出
parse_data = I only have paragraph
答案 0 :(得分:2)
您只需使用element.get_text()
>>> from bs4 import BeautifulSoup
>>> sample1 = BeautifulSoup('''\
... <div class='content'>
... <p> Hello I have a link </p>
...
... <li> I have a bullet point
...
... <a href="foo.com">foo</a>
... </div>
... ''').find('div')
>>> sample2 = BeautifulSoup('''\
... <div class='content'>
... <p> I only have paragraph </p>
...
... </div>
... ''').find('div')
>>> sample1.get_text()
u'\n Hello I have a link \n I have a bullet point\n\nfoo\n'
>>> sample2.get_text()
u'\n I only have paragraph \n'
或者您可以使用element.stripped_strings
将其删除一点:
>>> ' '.join(sample1.stripped_strings)
u'Hello I have a link I have a bullet point foo'
>>> ' '.join(sample2.stripped_strings)
u'I only have paragraph'
要获取所有链接,请查找具有a
属性的所有href
元素,并将其收集到列表中:
>>> [a['href'] for a in sample1.find_all('a', href=True)]
['foo.com']
>>> [a['href'] for a in sample2.find_all('a', href=True)]
[]
href=True
参数将搜索范围限制为定义了<a>
属性的href
代码。
答案 1 :(得分:1)
根据Beautiful Soup docs,迭代标记的子项使用.contents将它们作为列表或.children(生成器)。
for child in title_tag.children:
print(child)
因此,在您的情况下,例如,您获取每个标记的.text并将其连接在一起。我不清楚你是想要链接位置还是只是标签,如果是前者,请参考这个SO question。