我正在试图抓住一个网站,并希望获得特定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
中指定这些divsoup.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标签类。我很感激任何帮助!
答案 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在这些时候非常有用。