2015-06-30 1 views
1

Так как названия состояния у меня есть некоторый HTML код из http://chem.sis.nlm.nih.gov/chemidplus/name/acetone что я разбор и хочу, чтобы извлечь некоторые данные, такие как ацетон под MeSH Heading из моей аналогичной должности How to set up XPath query for HTML parsing?Могу ли я получить доступ к subchild родителя в XPath?

<div id="names"> 
<h2>Names and Synonyms</h2> 
    <div class="ds"> 
    <button class="toggle1Col" title="Toggle display between 1 column of wider results and multiple columns.">&#8596;</button> 
<h3>Name of Substance</h3> 
<div class="yui3-g-r"> 
    <div class="yui3-u-1-4"> 
    <ul> 
    <li id="ds2"> 
    <div>2-Propanone</div> 
    </li> 
    </ul> 
    </div> 
    <div class="yui3-u-1-4"> 
    <ul> 
    <li id="ds3"> 
    <div>Acetone</div> 
    </li> 
    </ul> 
    </div> 
    <div class="yui3-u-1-4"> 
    <ul> 
    <li id="ds4"> 
    <div>Acetone [NF]</div> 
    </li> 
    </ul> 
    </div> 
    <div class="yui3-u-1-4"> 
    <ul> 
    <li id="ds5"> 
    <div>Dimethyl ketone</div> 
    </li> 
    </ul> 
    </div> 
</div> 
<h3>MeSH Heading</h3> 
    <ul> 
    <li id="ds6"> 
    <div>Acetone</div> 
    </li> 
    </ul> 
</div> 
</div> 

Ранее в других страницах я бы делать mesh_name = tree.xpath('//*[text()="MeSH Heading"]/..//div')[1].text_content() для извлечения данных, потому что другие страницы имели сходные структуры, но теперь я вижу, что это не так, поскольку я не учитывал несогласованность. Итак, есть ли способ после перехода к узлу, который я хочу, а затем получить его подщелки, что позволяет обеспечить согласованность между разными страницами?

Будет ли tree.xpath('//*[text()="MeSH Heading"]//preceding-sibling::text()[1]') работать?

ответ

1

Из чего я понимаю, вам нужно получить список предметов по заголовку.

Как о создании многоразовой функции, которая будет работать для каждой товарной позиции в «названиях и синонимы» контейнер:

from lxml.html import parse 


tree = parse("http://chem.sis.nlm.nih.gov/chemidplus/name/acetone") 

def get_contents_by_title(tree, title): 
    return tree.xpath("//h3[. = '%s']/following-sibling::*[1]//div/text()" % title) 

print get_contents_by_title(tree, "Name of Substance") 
print get_contents_by_title(tree, "MeSH Heading") 

распечатки:

['2-Propanone', 'Acetone', 'Acetone [NF]', 'Dimethyl ketone'] 
['Acetone'] 
+0

Ах вы правы, я забыл о функциях , Хотя вы могли бы объяснить синтаксис xpath для этой функции? – TimTom

+0

@TimTom Конечно, здесь мы размещаем 'h3' по тексту, получаем следующий следующий сиблинг и извлекаем текст всех элементов div внутри этого родного брата. Надеюсь, это немного изменит ситуацию. – alecxe

Смежные вопросы