3

BeautifulSoupを使用してHTMLツリーのセクションを検索する単純なPythonスクリプトがあります。たとえば、<div id="doctext">タグ内のすべてを検索するために、スクリプトは次のようにします。

html_section = str(soup.find("div", id="doctext"))

find()ただし、入力ファイルで指定された文字列に応じて、引数を変更できるようにしたいと思います。たとえば、ユーザーはスクリプトにURLの後に、のような文字列をフィードする"div", id="doctext"と、スクリプトはそれに応じて検索結果を調整します。入力ファイルが次のようになっていると想像してください。

http://www.example.com | "div", id="doctext"

スクリプトは行を分割してURLを取得します。これは正常に機能しますが、引数も取得する必要があります。例えば:

vars = line.split(' | ')
html = urllib2.urlopen(vars[0]).read()
soup = BeautifulSoup(html)
args = vars[1].split()
html_section = str(soup.find(*args))

これは機能しません---そして私がこれを行うために複数の方法を試みてきたのでおそらく意味がありません。soup.find()入力ファイルによって提供された文字列を取得し、関数の正しい構文に準備するにはどうすればよいですか?

4

2 に答える 2

1

line次のように解析できます。

line = 'http://www.example.com | div, id=doctext'
url, args = line.split(' | ', 1)
args = args.split(',')
name = args[0]
params = dict([param.strip().split('=') for param in args[1:]])
print(name)
print(params)

収量

div
{'id': 'doctext'}

次に、次のように呼び出すことができますsoup.find

html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
html_section = str(soup.find(name, **params))

警告:(doctextまたは他のキーワード引数)にカンマが含まれている場合は、

args = args.split(',')

パラメータを間違った場所に分割します。textこの問題は、コンマを含むコンテンツを検索している場合に発生する可能性があります。


それでは、より良い解決策を探しましょう:

上記の問題を回避するには、引数にJSON形式lineを使用することを検討してください。次のようになります。

'http://www.example.com | ["div", {"id": "doctext"}]'

次に、それを解析できます

import json
line = 'http://www.example.com | ["div", {"id": "doctext"}]'
url, arguments = line.split('|', 1)
url = url.strip()
arguments = json.loads(arguments)
args = []
params = {}
for item in arguments:
    if isinstance(item, dict):
        params = item
    else:
        args.append(item)

print(args)
print(params)

これは

[u'div']
{u'id': u'doctext'}

その後、あなたはで呼び出すことができsoup.findます

html_section = str(soup.find(*args, **params))

追加の利点は、だけでなく、任意の数のsoup.findの位置引数(、、、、および)をname指定できることです。attrsrecursivetextname

于 2012-11-24T03:11:09.747 に答える
0

ユーザーがスクリプトにそれらの引数をフィードすると仮定し、sys.argvでそれらを取得してから、コードでそれらを使用します

#foo.py
import sys

for arg in sys.argv:
    print arg

hvn@hvnatvcc: ~/test $ python foo.py http://xyz.com div doctext
foo.py
http://xyz.com
div
doctext

コードは次のようになります

html = urllib2.urlopen(sys.argv[1]).read()
soup = BeautifulSoup(html)
html_section = str(soup.find(sys.argv[2], id=sys.argv[3]))

コードの何が問題になっていますか: 文字列では関数のキーワークとしてfind()扱われません。Pythonは文字列全体として表示されます。idid="doctext"'id="doctext"'

于 2012-11-24T03:44:53.050 に答える