从我看到的方法来导出Xpath的路径来刮取页面对我来说并不完全清楚。我正在尝试在python中使用Xpath来获取状态和大写的维基百科文章,以获取状态列表和资本列表,但到目前为止,在尝试找出正确的使用路径时,我没有运气。我已经尝试检查元素并在那里复制Xpath,但我仍然没有运气。我正在寻找某人来解释一个方法来找出用于抓取页面中某些元素的正确xpath。
from lxml import html
import requests
page = requests.get('https://en.wikipedia.org/wiki/List_of_capitals_in_the_United_States')
tree = html.fromstring(page.text)
#creating list of states
state = tree.xpath('xpath')
#list of capitals
capital = tree.xpath('xpath')
print 'State: ', state
print 'Capital: ', capital
到目前为止我尝试过的两条xpath是:
//*[@id="mw-content-text"]/table[1]/tbody/tr[1]/td[1]/a
//*[@id="mw-content-text"]/table[1]/tbody/tr[1]/td[2]
答案 0 :(得分:1)
从一个能让你获得表格的表达式开始。这是一个有效的方法:
>>> tree.xpath('//div[@id="mw-content-text"]/table[1]')
[<Element table at 0x7f9dd7322578>]
您想要div
中的第一个表(因此是[1]
),并且那里似乎没有tbody
元素。
您可以像这样迭代该表中的行:
for row in tree.xpath('//div[@id="mw-content-text"]/table[1]/tr')[1:]:
在该循环中,州名称为:
row[0][0].text
这是该行的第一个子元素(它是<td>
元素),然后是该元素的第一个子元素(它是<a>
元素),然后是该元素的文本内容。
首都是:
row[3][0].text
所以:
>>> for row in tree.xpath('//div[@id="mw-content-text"]/table[1]/tr')[1:]:
... st = row[0][0].text
... cap = row[3][0].text
... print 'The capital of %s is %s' % (st, cap)
The capital of Alabama is Montgomery
The capital of Alaska is Juneau
The capital of Arizona is Phoenix
[...]
你可以得到这样的所有州名:
>>> tree.xpath('//div[@id="mw-content-text"]/table[1]/tr/td[1]/a/text()')
['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming']