2

我想获取此页面第一列中所有元素的链接(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

4 回答 4

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 中跳过它)。

希望有帮助。

于 2013-08-13T19:41:49.570 回答
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'])

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

for href in parser.xpath("//a/@href"):
    urls.append(href)
于 2013-08-13T19:44:05.640 回答
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)
于 2013-08-13T19:44:32.133 回答
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
于 2013-08-13T19:41:40.547 回答