XPath查询使用span类属性上的关键字获取h2 / h3标签下面的<li>元素

时间:2016-01-01 23:59:52

标签: python html xpath scrapy

我有一个结构HTML,如下所示:

<h3><span class="important">important 1</span></h3>
<ul><li>1</li></ul>
<ul><li>2</li></ul>

<h2><span class="important_2">important 2</span></h2>
<ul><li>3</li></ul>
<ul><li>4</li></ul>

<h3><span class="not_important">not important</span></h3>
<ul><li>5</li></ul>
<ul><li>6</li></ul>

<h2><span class="not_important_2">not important</span></h2>
<ul><li>7</li></ul>
<ul><li>8</li></ul>

我试图获取除<li>h2以下的所有h3个元素,其中包含关键字为not_important的类名,但我不会&#39 ;我真的知道如何去做。

这是我到目前为止所做的事情:

In [1]: import scrapy

In [2]: selector = scrapy.Selector(text="""<h3><span class="important">important 1</span></h3>
   ...:     <ul><li>1</li></ul>
   ...:     <ul><li>2</li></ul>
   ...:     
   ...:     <h2><span class="important_2">important 2</span></h2>
   ...:     <ul><li>3</li></ul>
   ...:     <ul><li>4</li></ul>
   ...:     
   ...:     <h3><span class="not_important">not important</span></h3>
   ...:     <ul><li>5</li></ul>
   ...:     <ul><li>6</li></ul>
   ...:     
   ...:     <h2><span class="not_important_2">not important</span></h2>
   ...:     <ul><li>7</li></ul>
   ...:     <ul><li>8</li></ul>""")

In [3]: not_important = selector.xpath(".//span[contains(@class, 'not_important')]")

In [4]: not_important
Out[4]: 
[<Selector xpath=".//span[contains(@class, 'not_important')]" data=u'<span class="not_important">not importan'>,
 <Selector xpath=".//span[contains(@class, 'not_important')]" data=u'<span class="not_important_2">not import'>]

我的想法是获得所有 <li>元素。然后使用上面的代码与following-sibling::ul结合使用我不想要的所有元素(当我执行not_important[0].xpath("following-sibling::ul")时它不起作用)并且最后,我要从list每个<li>元素中排除我不想要的所有内容。

换句话说,我被卡住了。任何帮助将受到赞赏和新年快乐,。

1 个答案:

答案 0 :(得分:0)

我们的想法是使用precedingfollowing的组合来获取&#34; important&#34;之间的每个ul元素。并且&#34;不重要&#34;元素:

//ul[preceding::span/@class ="important" and 
     following::span/@class = "not_important"]/li/text()

根据提供的示例输入为我工作(提取['1', '2', '3', '4'])。