我希望从此网站获取播放器和裁判内容并将其存储在数据库中。首先,当我查看它时,所有玩家和裁判都在response.css(“div.prelims p.indent :: text”)中,我可以使用正则表达式解析那些与裁判员的球员。没问题。
然后我更加努力地看一下网站的其他部分,却发现他们并没有始终如一地遵循这种结构。这是一个例子:
<div class="prelims">
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p1">
<span class="num">1</span>
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p2">
<span class="num">2</span>
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p3">
<span class="num">3</span>
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p4">
<span class="num">4</span>
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p5">
<span class="num">5</span>
<p class="indent">Text about referee.</p>
</div>
<div class="num" id="p6">
这个页面不仅具有另一个页面没有的'num'和'span',而且我的正则表达式在测试页面上工作得很好,在这里打破了第一个p class = indent。
蜘蛛设计的一般原则是什么,可以使我的蜘蛛对所有这些变化更具弹性,并且仍然能够将结果放入我的数据库中的正确表格中?我正在使用DjangoItem,并期待一个平滑的管道进入我的数据库,但现在我可能不得不纠缠这些数据,甚至让它插入正确的形状插入。您的智慧,洞察力和经验非常受欢迎。
答案 0 :(得分:1)
如果您要捕获的所有div
标记都包含缩进类,我认为您可以忽略p
标记:
import re
text = r'''
<div class="prelims">
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p1">
<span class="num">1</span>
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p2">
<span class="num">2</span>
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p3">
<span class="num">3</span>
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p4">
<span class="num">4</span>
<p class="indent">Text about players.</p>
</div>
<div class="num" id="p5">
<span class="num">5</span>
<p class="indent">Text about referee.</p>
</div>
<div class="num" id="p6">
'''
pattern = re.compile(r"<p.*class=[\"\']indent[\"\'].*>(.+)<\/p>", re.MULTILINE)
for m in re.findall(pattern, text):
print(m)
输出:
Text about players.
Text about players.
Text about players.
Text about players.
Text about players.
Text about referee.