
wxpath - XPath के साथ घोषणात्मक वेब क्रॉलिंग; एक वेब क्वेरी भाषा (WQL)
नया: TUI - wxpath एक्सप्रेशन्स का परीक्षण करने और डेटा निर्यात करने के लिए इंटरैक्टिव टर्मिनल इंटरफ़ेस (Textual द्वारा संचालित)।

Python 3.10+ आवश्यक है।
pip install wxpath
# TUI समर्थन के लिए:
pip install "wxpath[tui]"
# uv के माध्यम से तुरंत TUI लॉन्च करें:
uvx --from "wxpath[tui]" wxpath-tui
wxpath एक घोषणात्मक वेब क्रॉलर है जिसमें ट्रैवर्सल सीधे XPath में व्यक्त किया जाता है। इम्पेरेटिव क्रॉल लूप लिखने के बजाय, wxpath आपको एक ही एक्सप्रेशन में यह वर्णन करने देता है कि क्या अनुसरण करना है और क्या निकालना है। wxpath उस एक्सप्रेशन को समवर्ती रूप से, breadth-first-ish, निष्पादित करता है और परिणामों को खोजे जाने पर स्ट्रीम करता है।
यह एक्सप्रेशन एक पेज लाता है, लिंक निकालता है, और उन्हें समवर्ती रूप से स्ट्रीम करता है - किसी क्रॉल लूप की आवश्यकता नहीं:
import wxpath
expr = "url('https://quotes.toscrape.com')//a/@href"
for link in wxpath.wxpath_async_blocking_iter(expr):
print(link)
url(...) ऑपरेटर और /// सिंटैक्स प्रस्तुत करके, wxpath का इंजन रिकर्सिव (या पैजिनेटेड) वेब क्रॉलिंग और एक्सट्रैक्शन करने में सक्षम है:
import wxpath
path_expr = """
url('https://quotes.toscrape.com')
///url(//a/@href)
//a/@href
"""
for item in wxpath.wxpath_async_blocking_iter(path_expr, max_depth=1):
print(item)
अधिकांश वेब स्क्रेपर्स आपको पहले क्रॉल कंट्रोल फ्लो और दूसरे एक्सट्रैक्शन लिखने के लिए बाध्य करते हैं।
wxpath इन दो चरणों को एक में समेटता है:
ग्राफ से सीधे स्वच्छ, संरचित JSON पदानुक्रम निकालें - अपने LLMs को सिग्नल दें, शोर नहीं। अधिक विवरण के लिए LangChain इंटीग्रेशन देखें।
wxpath डिटर्मिनिस्टिक है (अर्थात: LLMs द्वारा संचालित नहीं)। हालांकि हम गारंटी नहीं दे सकते कि नेटवर्क स्थिर है, हम गारंटी दे सकते हैं कि ट्रैवर्सल स्थिर है।
दस्तावेज़ीकरण अब यहाँ उपलब्ध है।
url(...) और ///url(...) समझाया गयाimport wxpath
from wxpath.settings import CRAWLER_SETTINGS
# विनम्रता के लिए कस्टम हेडर; कुछ साइटों के लिए आवश्यक (जैसे, Wikipedia)
CRAWLER_SETTINGS.headers = {'User-Agent': 'my-app/0.4.0 (contact: [email protected])'}
# क्रॉल करें, फ़ील्ड निकालें, एक नॉलेज ग्राफ बनाएँ
path_expr = """
url('https://en.wikipedia.org/wiki/Expression_language')
///url(
//main//a/@href[
starts-with(., '/wiki/') and not(contains(., ':'))
]
)
/map{
'title': (//span[contains(@class, "mw-page-title-main")]/text())[1] ! string(.),
'url': string(base-uri(.)),
'short_description': //div[contains(@class, 'shortdescription')]/text() ! string(.),
'forward_links': //div[@id="mw-content-text"]//a/@href ! string(.)
}
"""
for item in wxpath.wxpath_async_blocking_iter(path_expr, max_depth=1):
print(item)
नोट: कुछ साइटें (Wikipedia सहित) उचित हेडर के बिना अनुरोधों को ब्लॉक कर सकती हैं।
कस्टम User-Agent सेट करने के लिए उन्नत: इंजन और क्रॉलर कॉन्फ़िगरेशन देखें।
उपरोक्त एक्सप्रेशन निम्नलिखित कार्य करता है:
https://en.wikipedia.org/wiki/Expression_language पर शुरू होता है।<main> सेक्शन में उन लिंक्स को फ़िल्टर करता है जो /wiki/ से शुरू होते हैं और उनमें कोलन (:) नहीं होता।url(...) और ///url(...) समझाया गयाurl(...) एक कस्टम ऑपरेटर है जो उपयोगकर्ता-निर्दिष्ट या आंतरिक रूप से उत्पन्न URL की सामग्री लाता है और आगे की XPath प्रोसेसिंग के लिए इसे lxml.html.HtmlElement के रूप में लौटाता है।///url(...) एक डीप क्रॉल को इंगित करता है। यह रनटाइम इंजन को निर्दिष्ट max_depth तक लिंक्स का अनुसरण जारी रखने के लिए कहता है। बार-बार url() हॉप्स के विपरीत, यह एक ही एक्सप्रेशन को गहरे ग्राफ अन्वेषण का वर्णन करने की अनुमति देता है। चेतावनी: ट्रैवर्सल विस्फोट से बचने के लिए सावधानी और बाधाओं (max_depth या XPath प्रेडिकेट्स के माध्यम से) के साथ उपयोग करें।भाषा डिज़ाइन के विवरण के लिए DESIGN.md देखें। आप मूल अवधारणाओं को देखेंगे और भाषा को शुरू से डिज़ाइन करेंगे।
wxpath एक एक्सप्रेशन को ट्रैवर्सल और एक्सट्रैक्शन चरणों की सूची के रूप में मूल्यांकित करता है (आंतरिक रूप से Segments कहा जाता है)।
url(...) क्रॉल कार्यों को स्थिर रूप से (एक निश्चित URL के माध्यम से) या गतिशील रूप से (XPath एक्सप्रेशन से व्युत्पन्न URL के माध्यम से) बनाता है। URLs को वैश्विक रूप से, best-effort आधार पर डिडुप्लिकेट किया जाता है - प्रति-गहराई नहीं।
XPath सेगमेंट लाए गए दस्तावेज़ों पर कार्य करते हैं (तुरंत पूर्ववर्ती url(...) ऑपरेशनों के माध्यम से लाए गए)।
///url(...) डीप क्रॉलिंग को इंगित करता है - यह max_depth तक breadth-first-ish आगे बढ़ता है।
परिणाम तैयार होते ही प्राप्त होते हैं।
wxpath asyncio/aiohttp-first है, जो क्रॉलिंग और डेटा निष्कर्षण के लिए एक एसिंक्रोनस API प्रदान करता है।
import asyncio
from wxpath import wxpath_async
items = []
async def main():
path_expr = "url('https://en.wikipedia.org/wiki/Expression_language')///url(//@href[starts-with(., '/wiki/')])//a/@href"
async for item in wxpath_async(path_expr, max_depth=1):
items.append(item)
asyncio.run(main())
wxpath एक asyncio-in-sync API भी प्रदान करता है, जो सिंक्रोनस कोड की सरलता बनाए रखते हुए कई पेजों को समवर्ती रूप से क्रॉल करने की अनुमति देता है। यह विशेष रूप से सख्ती से सिंक्रोनस निष्पादन वातावरण (यानी, asyncio इवेंट लूप के अंदर नहीं) में क्रॉल के लिए उपयोगी है जहाँ प्रदर्शन चिंता का विषय है।
from wxpath import wxpath_async_blocking_iter
path_expr = "url('https://en.wikipedia.org/wiki/Expression_language')///url(//@href[starts-with(., '/wiki/')])//a/@href"
items = list(wxpath_async_blocking_iter(path_expr, max_depth=1))
wxpath डिफ़ॉल्ट रूप से WXPathEngine(..., robotstxt=True) कंस्ट्रक्टर के माध्यम से robots.txt का सम्मान करता है।
wxpath Python API संरचित ऑब्जेक्ट प्रदान करता है।