2014-02-20 49 views
1

我在lxml library的幫助下使用Python處理HTML。我試圖解析this website,我的目標是解析常規賽發生的所有比賽(不是在淘汰賽或精英賽中)。我遇到的問題:使用Python lxml(html)庫從html中選擇兄弟姐妹

我選擇所有具有nob-border類的元素,我可以這樣做。

subpage.cssselect(".nob-border") 

庫lxml具有此函數cssselect,它允許使用CSS選擇器選擇HTML元素。接下來我想要做的是選擇每個元素,直到下一個具有類nob-border的tr元素。 HTML看起來像這樣:

<tr class="center nob-border"> 
<tr class="table-dummyrow"> 
<tr class="odd deactivate" xeid="IqLK6ZNT"> 
<tr class=" deactivate" xeid="l0Xo8yvB"> 
<tr class="odd deactivate" xeid="QLnrBc9b"> 
<tr class=" deactivate" xeid="8pxmAHO4"> 
<tr class="odd deactivate" xeid="nVmvCwfh"> 
<tr class=" deactivate" xeid="v1lEBJvn"> 
<tr class="center nob-border"> 

有些行與nob-border類以及這些行之間的一堆行。我需要選擇中間的那些。除此之外,我不想只選擇它們之間的所有行,我希望爲每行使用nob-border類選擇那些行下方的行,並在類nob-border的下一行上面選擇。我希望我很清楚,如果不是毫不猶豫地提問。

回答

1

這不是優雅,但我可以提出這樣的:

for tr in subpage.cssselect('tr.nob-border'): 
    previous = tr.xpath('count(./preceding-sibling::tr)+1') 
    next = tr.xpath('count(./following-sibling::tr[contains(@class, "nob-border")][1]/preceding-sibling::tr)+1') 
    tr_in_between = tr.xpath('./following-sibling::tr[position() < $next]', next=next-previous) 

每個錶行tr與「打頭界」級,

  • 確定在tr兄弟姐妹序列當前行的位置
  • 確定下一個tr行與「nob-邊界」類的位置
  • 全選tr個兄弟姐妹中的2個位置
  • 之間

下面是一個使用了 「套」 EXSLT擴展的替代解決方案的位置:

for tr in subpage.cssselect('tr.nob-border'): 
    tr.xpath(""" set:difference(following-sibling::tr[not(contains(@class, "nob-border"))], 
           following-sibling::tr[contains(@class, "nob-border")] 
                /following-sibling::tr)""", 
      namespaces={"set": "http://exslt.org/sets"}) 
+0

謝謝:)工作很好。 –

0

這種精益更多的蟒蛇,留下cssselect早些時候:

>>> trs = subpage.cssselect('tr') 
>>> for prev, curr, next in zip(trs, trs[1:], trs[2:]): 
...  if curr.cssselect('.nob-border'): 
...   print prev,curr,next