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