python 파이썬 - BeautifulSoup에서 xpath를 사용할 수 있습니까?




파싱 크롤링 (6)

나는 BeautifulSoup을 사용하여 URL을 다 쳤고 다음 코드를 가졌다.

import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

url =  "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
soup = BeautifulSoup(the_page)
soup.findAll('td',attrs={'class':'empformbody'})

이제 위의 코드에서 findAll 을 사용하여 관련 태그와 정보를 얻을 수 있지만 xpath를 사용하려고합니다. BeautifulSoup에서 xpath를 사용할 수 있습니까? 가능한 경우 더 도움이 될 수 있도록 예제 코드를 제공해 주실 수 있습니까?


Answers

Nope, BeautifulSoup는 XPath 표현식을 지원하지 않습니다.

대체 라이브러리 인 lxml XPath 1.0을 지원합니다. 그것은 BeautifulSoup 호환 모드 를 가지고 있습니다.이 모드 에서는 스프가하는 것처럼 깨진 HTML을 구문 분석합니다. 그러나 기본 lxml HTML 구문 분석기 는 손상된 HTML을 파싱하는 것과 마찬가지로 효과적입니다.

문서를 lxml 트리로 구문 분석하면 .xpath() 메서드를 사용하여 요소를 검색 할 수 있습니다.

import urllib2
from lxml import etree

url =  "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = urllib2.urlopen(url)
htmlparser = etree.HTMLParser()
tree = etree.parse(response, htmlparser)
tree.xpath(xpathselector)

CSS Selector 지원이 가능합니다 . CSSSelector 클래스는 CSS 문을 XPath 식으로 변환하므로 CSSSelector 대한 검색이 훨씬 쉬워집니다.

from lxml.cssselect import CSSSelector

td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
    # Do something with these table cells.

완벽한 서클 : BeautifulSoup 자체 꽤 괜찮은 CSS 선택기 지원을 제공합니다 .

for cell in soup.select('table#foobar td.empformbody'):
    # Do something with these table cells.

Martijn의 코드가 더 이상 제대로 작동하지 않습니다 (현재 4 살 이상입니다 ...). etree.parse() 행은 콘솔에 인쇄하고 tree 변수에 값을 할당하지 않습니다. 이를 참조하여 요청과 lxml을 사용하여이 작업을 이해할 수있었습니다.

from lxml import html
import requests

page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.content)
#This will create a list of buyers:
buyers = tree.xpath('//div[@title="buyer-name"]/text()')
#This will create a list of prices
prices = tree.xpath('//span[@class="item-price"]/text()')

print 'Buyers: ', buyers
print 'Prices: ', prices

이것은 꽤 오래된 스레드이지만, 지금은 해결 방법이 있습니다. 이것은 현재 BeautifulSoup에 없을 수도 있습니다.

다음은 내가 한 일의 예입니다. "요청"모듈을 사용하여 RSS 피드를 읽고 "rss_text"라는 변수에 텍스트 콘텐츠를 가져옵니다. 그것으로 BeautifulSoup을 실행하고 xpath / rss / channel / title을 검색하고 그 내용을 검색합니다. 그 모든 영광 (XPath는 와일드 카드, 다중 경로 등)에서 정확히 XPath가 아니지만 원하는 기본 경로가 있으면이 방법이 유용합니다.

from bs4 import BeautifulSoup
rss_obj = BeautifulSoup(rss_text, 'xml')
cls.title = rss_obj.rss.channel.title.get_text()

Beautiful Soup에는 XPath 지원이 없음을 확인할 수 있습니다.


BeautifulSoup에는 현재 요소가 지시하는 childern의 findNext 라는 함수가 있습니다.

father.findNext('div',{'class':'class_value'}).findNext('div',{'id':'id_value'}).findAll('a') 

위의 코드는 다음 xpath를 모방 할 수 있습니다.

div[class=class_value]/div[id=id_value]

다른 사람들은 사실상 time 모듈을 제안했지만, 나는 matplotlibpyplot 함수를 사용하여 다른 방법을 공유 할 것이라고 생각했다.

예제

from matplotlib import pyplot as plt
plt.pause(5)    # Pauses the program for 5 seconds

일반적으로 이것은 플롯이 플롯 되 자마자 사라지는 것을 방지하거나 거친 애니메이션을 만드는 데 사용됩니다.

이렇게하면 matplotlib 를 이미 import 경우 import 가 절약됩니다.







python xpath beautifulsoup urllib