正则表达式查询Python

时间:2012-11-15 04:38:58

标签: python regex screen-scraping

我正在尝试编写一个脚本来抓取一个网站,并使用这个(http://www.theericwang.com/scripts/eBayRead.py)。

但我想用它来抓取ebay以外的网站,并根据我的需要进行自定义。

我对python很新,而且经验有限。

我不确定这条线能达到什么目标。

for url, title in re.findall(r'href="([^"]+).*class="vip" title=\'([^\']+)', lines):

有人可以给我一些指示吗?

如果我将其移植到其他网站,还有什么需要考虑的吗?

3 个答案:

答案 0 :(得分:3)

我不确定这是否能回答你的问题。但您可以考虑 scrapy http://scrapy.org来抓取各种网站。它是一个很好的基础设施,提供了很大的灵活性,并且易于根据某些特定需求进行定制。

答案 1 :(得分:3)

一般来说,解析HTML最好使用像BeautifulSoup这样的库,它可以为您完成所有繁重的工作,为您提供更直观的代码。另外,请阅读下面的@Tadeck链接 - 如果可以避免使用正则表达式和HTML,那么就不要混淆(简而言之)。

至于你的问题,该行使用称为“正则表达式”的东西来查找文本中的匹配模式(在本例中为HTML)。 re.findall()是一个返回列表的方法,所以如果我们只关注那个:

re.findall(r'href="([^"]+).*class="vip" title=\'([^\']+)', lines):

r表示以下内容将被解释为'raw',这意味着反斜杠等字符将按字面解释。

href="([^"]+)

括号表示一个组(我们在匹配中关注的内容),[^"]+表示'匹配任何不是引用的内容'。正如您可能猜到的,该组将返回链接的URL。

.*class="vip"

.*匹配任何东西(好吧,几乎任何东西)0次或更多次(这里可能包括其他标签,链接的结束引用,空白等)。 class="vip"没什么特别的 - 它只需要出现。

title=\'([^\']+)', lines):

在这里,您可以看到一个转义报价,然后是我们在上面看到的另一个组。这一次,我们在title标签之后捕获两个撇号之间的任何内容。

这样做的最终结果是你正在迭代所有匹配的列表,这些匹配看起来像(my_matched_link, my_matched_title),这些匹配被传递到for url, title,之后进一步处理

答案 2 :(得分:2)

正则表达式不适合解析HTML

以上是我想与您沟通的主要想法。对于 why ,请参阅此问题:RegEx match open tags except XHTML self-contained tags

简而言之,HTML可以作为文本进行更改(例如,可以添加新属性,可以更改属性的顺序,或者可以引入其他一些更改),但是它将导致与Web解释的完全相同的HTML浏览器,同时完全破坏你的脚本。

应使用专门的HTML解析器或网络抓取工具解析HTML。当它变得重要时,他们知道差异。

刮痧用什么?

有多种解决方案,但最值得注意的解决方案之一是:ScraPy。尝试一下,你可能会开始喜欢它。