如何为 HTML 解析设置 XPath 查询?
How to set up XPath query for HTML parsing?
这是 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.">↔</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"
重要的是要检查由 page.text
而不是 return 编辑的字符串
只需依赖您的 Chrome 浏览器 return 编辑的页面源代码。网站可以
return 根据 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.">↔</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>
标签不是子标签,而是 <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'
这是 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.">↔</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"
重要的是要检查由 page.text
而不是 return 编辑的字符串
只需依赖您的 Chrome 浏览器 return 编辑的页面源代码。网站可以
return 根据 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.">↔</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>
标签不是子标签,而是 <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'