使用xpath访问元素?

时间:2013-08-13 19:35:23

标签: python html xpath html-parsing lxml

我想获取此页面第一列中所有元素的链接(http://en.wikipedia.org/wiki/List_of_school_districts_in_Alabama)。

我很自在地使用BeautifulSoup,但它似乎不太适合这项任务(我一直试图访问每个tr的内容的第一个孩子但是效果不是很好)。

xpath遵循常规模式,下面表达式中每个新行的行号更新:

xpath = '//*[@id="mw-content-text"]/table[1]/tbody/tr[' + str(counter) + ']/td[1]/a'

有人会通过发布迭代行来获取链接来帮助我吗?

我正在思考这些问题:

urls = []

while counter < 100:
     urls.append(get the xpath('//*[@id="mw-content-text"]/table[1]/tbody/tr[' + str(counter) + ']/td[1]/a'))
     counter += 1

谢谢!

4 个答案:

答案 0 :(得分:3)

以下是有关如何从第一列获取所有链接的示例:

from lxml import etree
import requests

URL = "http://en.wikipedia.org/wiki/List_of_school_districts_in_Alabama"
response = requests.get(URL)

parser = etree.HTMLParser()
tree = etree.fromstring(response.text, parser)

for row in tree.xpath('//*[@id="mw-content-text"]/table[1]/tr'):
    links = row.xpath('./td[1]/a')
    if links:
        link = links[0]
        print link.text, link.attrib.get('href')

请注意,浏览器会附加tbody - lxml将看不到此标记(只是在xpath中跳过它)。

希望有所帮助。

答案 1 :(得分:1)

这应该有效:

from lxml import html

urls = []

parser = html.parse("http://url/to/parse")
for element in parser.xpath(your_xpath_query):
    urls.append(element.attrib['href'])

您还可以直接访问XPath查询中的href属性,例如:

for href in parser.xpath("//a/@href"):
    urls.append(href)

答案 2 :(得分:1)

您链接到的页面似乎没有您指定的XPath的内容。这是一个不同的XPath来完成这项工作:

import urllib2
import lxml.html as LH
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', "Mozilla/5.0")]
url = 'http://en.wikipedia.org/wiki/List_of_school_districts_in_Alabama'
xpath = '//table[@class="wikitable sortable"]//tr/td[1]/a/@href'
doc = LH.parse(opener.open(url))
urls = doc.xpath(xpath)
print(urls)

答案 3 :(得分:0)

也许你正在寻找像

这样的东西
urls = []
while True:
    try:
        counter = len(urls)+1
        (node,) = tree.xpath('//*[@id="mw-content-text"]/table[1]/tbody/tr[' + str(counter) + ']/td[1]/a')
        urls.append(node)
    except ValueError:
        break