用特定的类找到div的后代

时间:2017-07-12 01:13:19

标签: python python-3.x beautifulsoup bs4

我正在试图抓住一个网站,并希望获得特定div类的所有后代。例如,假设我的网站如下所示:

[编辑:问题的作者在评论中指出所有<div class = "blah"> <p></p> </div> <div class = "i-want-this"> <p></p> <p><a href= "http://www.google.com"></a></p> </div> <div class = "i-want-this"> <p></p> <li></li> <p>meh</p> <li></li> </div> 元素应该处于同一级别;因此,我可以自由地在这个示例代码中关闭它们。]

div = soup.find_all('div', {'class': 'i-want-this'})

我希望div类的每个实例的所有后代“我想要这个”并忽略其他div。我可以在find_all

中指定这些div
soup.div.descendants

但这只是创建了所有这些的列表。我也看到你可以通过

抓住后代
SELECT a.* 
FROM b 
INNER JOIN a on (b.id = a.b_id)
WHERE b.some_int_column = 2
ORDER BY a.id DESC
LIMIT 0,10

但我不知道如何指定我想要包含哪些div标签类。我很感激任何帮助!

3 个答案:

答案 0 :(得分:2)

这可能是你想要的:

div = soup.find_all('div', {'class': 'i-want-this'})

for e in div:
    print (e.descendents) #or append to list, or whatever you're trying to do.

答案 1 :(得分:1)

最终,我提出了这个解决方案。 “儿童”对象捕获了所有“div”和连续孩子的孩子;然后我重复了那个

children = soup.findChildren('div', {'class': 'i-want-this'})

content = []
for item in children:   
    item = [content for content in item.text.split('\n') if len(content)>0]

    # Create string from separate list items to all be listed in content
    item = ' '.join(item)
    content.append(item)

答案 2 :(得分:0)

我将您的HTML推送到名为temp.htm的文件中。

这样的任务只需要scrapy的一小部分:Selector。只需将HTML输入其中,然后使用其xpath方法。

在这种情况下,我可以使用感兴趣的div指定两个class元素中的一个,然后询问其所有后代,然后extract那些内容。每种情况下的结果都是从div的子项下降的元素列表。

>>> from scrapy.selector import Selector
>>> HTML = open('temp.htm').read()
>>> selector = Selector(text=HTML)
>>> selector.xpath('.//div[@class="i-want-this"][1]/*').extract()
['<p></p>', '<p><a href="http://www.google.com"></a></p>']
>>> selector.xpath('.//div[@class="i-want-this"][2]/*').extract()
['<p></p>', '<li>', '<p>meh</p>', '<li>']

The xpath cheatsheet在这些时候非常有用。