2017-03-03 89 views
0

例如:如何將BeautifulSoup元素轉換爲xpath?

html = " 
<ul> 
    <li class="item-0"><a href="link1.html">first item</a></li> 
    <li class="item-1"><a href="link2.html">second item</a></li> 
    <li class="item-inactive"><a href="link3.html">third item</a></li> 
    <li class="item-1"><a href="link4.html">fourth item</a></li> 
    <li class="item-0"><a href="link5.html">fifth item</a> 
</ul>" 
soup = BeautifulSoup(html) 
item_0 = soup.select_one('ul li.item-0') 

有沒有像soup_to_xpath(item_0)功能可以轉化item_0'/html/body/ul/li[5]'或類似這樣的東西嗎?

回答

0

AFAIK不可能與XPathbs4中一起使用。

提供CSS選擇器可以被 「翻譯」 成XPath爲:

//ul/li[@class="item-0"] 

//li[.="fifth element"] 

可以使用以下代碼:

from lxml import etree 
from lxml.cssselect import CSSSelector # You might need to run "pip install cssselect" 

sel = CSSSelector('ul li.item-0') 
sel.path 

輸出:

"descendant-or-self::ul/descendant-or-self::*/li[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]" 
+0

我僅僅指剛要獲得的XPath。 「提供的CSS選擇器可以」翻譯成「XPath」是什麼意思? – user7391482

+0

「ul li.item-0」是一個CSS選擇器。你是否想用'BeautifulSoup'來生成'XPath'或其他自動化工具來生成它?澄清您的問題 – Andersson

+0

「您是否想使用BeautifulSoup生成XPath或任何其他自動化工具來生成它?」這正是我想要的... – user7391482

0

LXML使用cssselect模塊來執行這樣的任務:

In [1]: from cssselect import GenericTranslator, SelectorError 

In [2]: expression = GenericTranslator().css_to_xpath('ul li.item-0') 

In [3]: expression 
Out[3]: "descendant-or-self::ul/descendant-or-self::*/li[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]"