2013-08-13 5 views
2

Я хотел бы получить ссылки на все элементы в первом столбце на этой странице (http://en.wikipedia.org/wiki/List_of_school_districts_in_Alabama).Элемент доступа с использованием xpath?

Мне удобно использовать BeautifulSoup, но он кажется менее подходящим для этой задачи (я пытался получить доступ к первому ребенку содержимого каждого tr, но это не так хорошо работает).

В XPaths следовать шаблону регулярного, номер строки обновления для каждой новой строки в следующем выражении:

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

Не просто ли вы оставите номер строки отлично и выберите первых детей каждой строки? Это в основном то, как работает XPath, вы не идентифицируете отдельные элементы, вы определяете шаблон, который должен совпадать с элементами. – millimoose

+0

О, извините, я понимаю, что вы имеете в виду. Вы имеете в виду использование xpath и отказ от номера строки, выбрав все ссылки в первом столбце? – goldisfine

+0

Кроме того, не совсем понятно, каков ваш вопрос. Если это «как использовать XPath с lxml», то в первую очередь документация должна охватывать это, как в нем прямо там, в меню. Если он создает выражение XPath, то, что я сказал, должно помочь, но в идеале вы должны экспериментировать с экспериментом. Как и в, начните с более простого выражения, распечатайте, что он соответствует, затем добавьте к нему. Также помните, что вам необязательно использовать выражение * one * XPath для всего запроса, вы работаете в Python, а не в XSLT, так что это нормально, если вы делаете это несколькими шагами. – millimoose

ответ

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).

Надеюсь, что это поможет.

+0

Удивительный ответ, спасибо! – goldisfine

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 
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) 
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) 
+1

Я думаю, что этот код «ловит» ссылки из других столбцов. – alecxe

+0

@alecxe: Ah. Нет проблем. Исправлена. В принципе, просто добавьте 'td [1]' в XPath. – unutbu

Смежные вопросы