2016-11-06 3 views
0

lxml возвращает два элемента, а beautifulsoup возвращает только один. Это потому, что <br/> не должен быть там, и beautifulsoup более терпим к плохому html?lxml разделяет элементы, пока beautifulsoup не

Есть ли лучший способ извлечь местоположение, используя lxml? <br/> не всегда есть.

from lxml import html 
from bs4 import BeautifulSoup as bs 

s = '''<td class="location"> 
    <p> 
    TRACY,<br/>&nbsp;CA&nbsp;95304&nbsp; 
    </p></td> 
''' 

tree = html.fromstring(s) 
r = tree.xpath('//td[@class="location"]/p/text()') 
print r 

soup = bs(s, 'lxml') 
r = soup.find_all('td', class_='location')[0].get_text() 
print r 

ответ

1

Есть ли лучший способ извлечь местоположение, используя lxml? <br/> не всегда есть.

Если, лучше вы имеете в виду, возвращающая результат, который ближе к его BS аналог, то выражение XPath, что лучше походить код BS будет:

>>> print tree.xpath('string(//td[@class="location"])') 


    TRACY, CA 95304  

Кроме того, если вам нравится лишние пробелы должны быть удалены, используйте normalize-space() вместо string():

>>> print tree.xpath('normalize-space(//td[@class="location"])') 
TRACY, CA 95304  
0

element.get_text() Соединения отдельные строки пробегов; от documentation:

Если вы хотите только текстовую часть документа или тега, вы можете использовать метод get_text(). Она возвращает весь текст в документе или под тегом, в виде одной строки Unicode

курсив мой.

Используйте Tag.strings generator, если вы хотите, чтобы отдельные строки:

>>> list(soup.find_all('td', class_='location')[0].strings) 
[u'\n', u'\n TRACY,', u'\xa0CA\xa095304\xa0\n '] 

Если вы хотите LXML присоединиться текст, а затем просто присоединиться текст:

r = ''.join(tree.xpath('//td[@class="location"]/p/text()')) 

string() XPath function может сделать то же самое для <td> тег:

r = tree.xpath('string(//td[@class="location"])') 

Демонстрация:

>>> ''.join(tree.xpath('//td[@class="location"]/p/text()')) 
u'\n TRACY,\xa0CA\xa095304\xa0\n ' 
>>> tree.xpath('string(//td[@class="location"])') 
u'\n \n TRACY,\xa0CA\xa095304\xa0\n ' 

Я хотел бы использовать str.strip() на любом результате:

>>> tree.xpath('string(//td[@class="location"])').strip() 
u'TRACY,\xa0CA\xa095304' 
>>> print tree.xpath('string(//td[@class="location"])').strip() 
TRACY, CA 95304 

или использовать normalize-space() XPath function:

>>> tree.xpath('normalize-space(string(//td[@class="location"]))') 
u'TRACY,\xa0CA\xa095304\xa0' 

str.strip() Обратите внимание, что снимает заднее неразрывное \xa0 пространства, в то время как листы normalise-space() Это.

+0

Я ищу одну строку из LXML , а не для дальнейшего разделения результата bs. «Есть ли лучший способ извлечь местоположение с помощью lxml?» – foosion

+0

@foosion: ах, действительно, читал слишком быстро. –

+0

Спасибо за попытку – foosion

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

  • Нет связанных вопросов^_^