2015-06-15 2 views
1

Вот код HTML от http://chem.sis.nlm.nih.gov/chemidplus/rn/75-07-0 в Google Chrome, который я хочу проанализировать на сайте для какого-либо проекта.Как настроить запрос XPath для разбора HTML?

<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 id="yui_3_18_1_3_1434394159641_407">Name of Substance</h3> 
    <ul> 
     <li id="ds2"> 
     `` <div>Acetaldehyde</div> 
     </li> 
    </ul> 
</div> 

Я написал питон скрипт, который поможет мне сделать такую ​​вещь, захватывая имя под одной из секций, но она просто не возвращает имя. Я думаю, что это мой запрос xpath, предложения?

from lxml import html 
import requests 
import csv 

names1 = [] 

page = requests.get('http://chem.sis.nlm.nih.gov/chemidplus/rn/75-07-0') 
tree = html.fromstring(page.text) 

//This will grab the name data 

names = tree.xpath('//*[@id="yui_3_18_1_3_1434380225687_700"]') 

//Print the name data 
print 'Names: ', names 

//Convert the data into a string 
names1.append(names) 

//Print the bit length 

print len(names1) 

//Write it to csv 

b = open('testchem.csv', 'wb') 
a = csv.writer(b) 
a.writerows(names1) 
b.close() 
print "The end" 
+0

Я ничего не знаю о Pyton, но может быть вам нужно добавить '/ текст()' - // * [@ ид = "yui_3_18_1_3_1434394159641_407"]/текст() – splash58

+0

Да я пробовал, но не получилось Работа. – TimTom

+0

Я открыл вашу ссылку, там нет такого элемента. – splash58

ответ

0

Важно проверить строку, возвращаемую page.text и не полагаться только на исходный код страницы, возвращаемый вашим Chrome браузером. Веб-сайты могут возвращать разные контенты в зависимости от User-Agent, и, кроме того, GUI-браузеры , такие как браузер Chrome, могут изменять контент, выполняя JavaScript, в то время как наоборот, requests.get нет.

Если записать содержимое в файл

import requests 
page = requests.get('http://chem.sis.nlm.nih.gov/chemidplus/rn/75-07-0') 
with open('/tmp/test', 'wb') as f: 
    f.write(page.text) 

и использовать текстовый редактор для поиска "yui_3_18_1_3_1434380225687_700" вы обнаружите, что нет тегов с этим значением атрибута.

Если вместо этого вы искать Name of Substance вы найдете

<div><br>Search for this InChIKey on the <a href="http://www.google.com/search?q=%22IKHGUXGNUITLKF-UHFFFAOYSA-N%22" target="new" rel="nofollow">Web</a></div></div><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><ul> 
<li id="ds2"><div>Acetaldehyde</div></li> 

Таким образом, вместо того, чтобы вы могли бы использовать:

In [219]: tree.xpath('//*[text()="Name of Substance"]/..//div')[0].text_content() 
Out[219]: 'Acetaldehyde' 

Как это XPath было найдено:

Начиная с <h3> тег:

In [215]: tree.xpath('//*[text()="Name of Substance"]') 
Out[215]: [<Element h3 at 0x7f5a290e85d0>] 

<div> тег, который мы хотим, чтобы это не ребенок, а это subchild из родительского <h3>. Поэтому идти к родителю:

In [216]: tree.xpath('//*[text()="Name of Substance"]/..') 
Out[216]: [<Element div at 0x7f5a290f02b8>] 

, а затем использовать //div для поиска всех <div> с внутри родителя:

In [217]: tree.xpath('//*[text()="Name of Substance"]/..//div') 
Out[217]: 
[<Element div at 0x7f5a290e88e8>, 
<Element div at 0x7f5a290e8940>, 
...] 

Первый div является тот, который мы хотим:

In [218]: tree.xpath('//*[text()="Name of Substance"]/..//div')[0] 
Out[218]: <Element div at 0x7f5a290e88e8> 

и мы можем извлечь текст, используя метод text_content:

In [219]: tree.xpath('//*[text()="Name of Substance"]/..//div')[0].text_content() 
Out[219]: 'Acetaldehyde' 
+0

Где вы получаете библиотеку страниц? или это графический интерфейс python? – TimTom

+0

К сожалению, это была опечатка. Он должен читать «запросы импорта». – unutbu

+0

Когда я пытаюсь запустить его, я получаю сообщение об ошибке с открытым циклом IOError: [Errno 2] Нет такого файла или каталога: '/ tmp/test' не следует ли создавать папку? – TimTom

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