【问题标题】:How to set up XPath query for HTML parsing?如何为 HTML 解析设置 XPath 查询?
【发布时间】:2015-06-15 18:46:59
【问题描述】:

这是来自 Google Chrome 中 http://chem.sis.nlm.nih.gov/chemidplus/rn/75-07-0 的一些 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>

我编写了一个 python 脚本来帮助我做这样的事情,方法是在其中一个部分下抓取名称,但它只是没有返回名称。我认为这是我的 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"

【问题讨论】:

  • 我对pyton一无所知,但可能你需要添加/text() - //*[@id="yui_3_18_1_3_1434394159641_407"]/text()
  • 是的,我试过了,但没用。
  • 我打开了你的链接,那里没有这样的元素。

标签: python xml parsing xpath lxml


【解决方案1】:

检查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:

&lt;h3&gt;标签开始:

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

我们想要的&lt;div&gt; 标签不是子标签,而是&lt;h3&gt; 的父标签的子标签。因此,向上到父级:

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

然后使用//div 搜索父级内的所有&lt;div&gt;s:

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'

【讨论】:

  • 您从哪里获得页面库?还是python GUI?
  • 当我尝试运行它时,我收到一个关于 with open loop IOError: [Errno 2] No such file or directory: '/tmp/test' 它不应该创建文件夹的错误吗?
  • 您是否以写入模式打开文件:即open('/tmp/test', 'wb') 或只是open('/tmp/test')
  • 这就是我所拥有的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) tree = html.fromstring(page.text)
  • 将该代码保存到文件(例如script.py)并运行python script.py。假设您的缩进是正确的,它应该可以工作。
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 2011-07-18
  • 2019-11-17
  • 2014-04-23
  • 2013-11-24
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多